【问题标题】:In Laravel 5 how do I implement an App::before() filter?在 Laravel 5 中,如何实现 App::before() 过滤器?
【发布时间】:2015-05-04 23:14:27
【问题描述】:

在 Laravel 4.2 中,我在根据 URL(admin.example.com 与 example.com)设置 Eloquent 模型和表之前有这个过滤器

这是我的过滤代码:

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 中做到这一点?

【问题讨论】:

  • 我自己没有对此进行测试,但您是否尝试简单地将您的前置过滤器添加到 app/Providers/RouteServiceProvider.php 的 boot() 方法中?在此处查看升级指南的“路由过滤器”部分:Upgrading To 5.0 From 4.2
  • 我将过滤器添加到 RouteServiceProvider 并让它工作。谢谢你的提示。 IT 不是一个很好的解决方案,因为我需要访问 Request::getHost() 并且 Request 在此处不可用。我实现了 $_SERVER['HTTP_HOST'] 的临时使用来获得我需要的东西。希望有人能找到更合适的方法来做到这一点。
  • 为了访问Request::getHost(),你只需要添加“use Illuminate\Http\Request;”在顶部,课前。

标签: routing laravel-5 laravel-middleware


【解决方案1】:

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

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

我会做以下事情:

  1. 这样创建路线:

    Route::get('/auth/login', 'AuthController@getLogin');
    Route::get('/auth/login/admin', 'AdminsController@getLogin');
    Route::get('/auth/login/sponsors', 'SponsorsController@getLogin');
    
  2. 创建一个中间件以防止赞助商访问 AdminsController,反之亦然。

  3. 在 AuthController 中,根据主机执行从 auth/login 到管理员或赞助商的重定向。

那么你只是在使用“标准”的 laravel 功能,你可以确定它不会引起任何奇怪的副作用。

【讨论】:

    猜你喜欢
    • 2015-06-15
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多