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

时间:2015-03-04 04:00:48

标签: routing laravel-5 laravel-middleware

在Laravel 4.2中,我在使用此过滤器之前根据URL设置了Eloquent模型和表格(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中做到这一点?

1 个答案:

答案 0 :(得分:1)

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

我理解你的解决方案,但是当你想要对它进行单元测试时,你会遇到麻烦,如果你能让它工作的话。配置在路由之前加载,因此根据请求设置路由是不可能的,除非你依赖$ _SERVER(它也会破坏单元测试)。

我会做以下事情:

  1. 创建路线:

      10x: 1893.54 ms  np.sum=26122208
    1000x:  411.71 ms  np.sum=26122208
    1000x:   26.60 ms  np.sum=39123624
    
  2. 创建一个中间件以防止赞助商访问AdminsController,反之亦然。

  3. 在AuthController内部,执行从Route::get('/auth/login', 'AuthController@getLogin'); Route::get('/auth/login/admin', 'AdminsController@getLogin'); Route::get('/auth/login/sponsors', 'SponsorsController@getLogin'); 到管理员或赞助商的重定向,具体取决于主机。

  4. 然后你只使用“标准”laravel功能,你可以确定它不会引起任何奇怪的副作用。