gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:05:53 24 4
gpt4 key购买 nike

在 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 设置调用的 Controller ,如下所示:
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 中做到这一点?

最佳答案

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

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

我会做以下事情:

  • 像这样创建路由:
    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 功能,并且您可以确定它不会引起任何奇怪的副作用。

    关于routing - 在 Laravel 5 中如何实现 App::before() 过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28846443/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com