Routing 在Laravel 5中,如何实现App::before()过滤器?

Routing 在Laravel 5中,如何实现App::before()过滤器?,routing,laravel-5,laravel-middleware,Routing,Laravel 5,Laravel Middleware,在Laravel4.2中,我有一个before过滤器,它根据URL(admin.example.com vs example.com)设置雄辩的模型和表 这是我的过滤代码: App::before(function($request) { // Check if we are using the admin URL $host = $request->getHost(); $parts = explode('.', $host); if ($parts[0]

在Laravel4.2中,我有一个before过滤器,它根据URL(admin.example.com vs example.com)设置雄辩的模型和表

这是我的过滤代码:

App::before(function($request)
{       
  // Check if we are using the admin URL
  $host = $request->getHost();
  $parts = explode('.', $host);
  if ($parts[0] == 'admin')
  {
    // Set the config for user info (not sponsor)
    Config::set('auth.model', 'Admin');
    Config::set('auth.table', 'admins');
  }
});
我尝试在laravel 5中为此创建中间件,代码如下:

class AdminOrSponsor implements Middleware {

  public function handle($request, Closure $next)
  {   
    $host = $request->getHost();
    $parts = explode('.', $host);
    if ($parts[0] == 'admin'){
        Config::set('auth.model', 'Admin');
        Config::set('auth.table', 'admins');
    }

    return $next($request);
  }

}
在我的routes.php文件中,我正在设置基于auth.model设置调用的控制器,如下所示:

Route::get('/auth/login', Config::get('auth.model') . 'Controller@getLogin');
Route::post('/auth/login', Config::get('auth.model') . 'Controller@postLogin');
Route::get('/auth/logout', Config::get('auth.model') . 'Controller@getLogout');
我发现路由都是在中间件之前读取的,所以我试图通过Config::set()进行的更改没有发生。我只获取auth.php配置文件中设置的值


我做错了什么?在Laravel 5中应该如何做?

似乎您希望根据客户端的主机名加载不同的路由

我理解你的解决方案,但这是一种黑客行为,如果你想对它进行单元测试,甚至可以让它工作的话,你会遇到麻烦。配置是在路由之前加载的,因此不可能根据请求设置路由,除非依赖$\u服务器(这也会破坏unittests)

我会这样做:

  • 按如下方式创建路由:

    Route::get('/auth/login', 'AuthController@getLogin');
    Route::get('/auth/login/admin', 'AdminsController@getLogin');
    Route::get('/auth/login/sponsors', 'SponsorsController@getLogin');
    
  • 创建一个中间件以防止发起人访问AdminsController,反之亦然

  • 在AuthController内部,根据主机的不同,执行从
    auth/login
    到管理员或发起人的重定向


  • 然后,您只使用“标准”的laravel功能,您可以确保它不会造成任何奇怪的副作用。

    我自己没有测试过这一点,但您是否尝试过简单地将before过滤器添加到app/Providers/RouteServiceProvider.php的boot()方法中?在这里查看升级指南的“路由筛选器”部分:我将我的筛选器添加到RouteServiceProvider并使其正常工作。谢谢你的提示。这不是一个很好的解决方案,因为我需要访问Request::getHost(),而Request在这里不可用。我实现了对$\u SERVER['HTTP\u HOST']的临时使用,以获取所需的内容。希望有人能找到一种更合适的方法来实现这一点。为了能够访问Request::getHost(),您只需要在类之前的顶部添加“use illumb\Http\Request;”。