【问题标题】:Resolve duplicate routes based on middleware group基于中间件组解决重复路由
【发布时间】:2016-10-17 13:43:02
【问题描述】:

web.php 中,我有两个用于两个用户角色的中间件组 - adminsnon_admins

Route::group(['middleware' => ['auth', 'admin']], function () {
    // if user is logged in AND has a role of admin...
    Route::get('/', 'Admin\IndexController@index');
});

Route::group(['middleware' => ['auth', 'non_admin']], function () {
    // if user is logged in AND has a role of non_admin
    Route::get('/', 'NonAdmin\IndexController@index');
});

adminnon_admin 中间件都检查Auth::user() 的角色分别是adminnon_admin;如果不是,则中间件以abort(403) 失败。 为什么我没有一个中间件?这样做的目的是将两个角色分开,以便每个角色都有自己独立的控制器逻辑和自己的视图

问题

如果我以 admin 身份登录,我会得到 403,如果我以 non_admin 身份登录,它会按预期工作。我的猜测:Laravel 看到了两条重复的路由,并且只解析了最后定义的一条(恰好在 ['middleware' => ['auth', 'non_admin']] 中)。

问题

如何解决重复的路由但分离控制器和表示逻辑?同样,adminnon_admin 用户将访问 same 路线 ('/') 但看到两个 不同 视图。 我也想在两个不同的控制器中实现这个。

【问题讨论】:

  • 你能发布中间件类吗?可能 AdminMiddleware 没有按预期工作。
  • 你是怎么解决这个问题的?我也有同样的问题。
  • @Notflip 显然你不能在 Laravel 中有重复的路由,因为它们指向同一个 URL。您可以使用Bouncer 来管理角色。

标签: laravel laravel-5.3


【解决方案1】:

嗯……

我个人会将所有内容封装在一个通用控制器下,并使用服务类执行必要的检查和修改。

但如果您真的希望根据您的角色将所有内容分开在两个不同的控制器下,您可以这样做。这假设您使用的是Laravel's built-in Authorization

路线

Route::group(['middleware' => ['auth']], function () {
    Route::get('/', function(){
        $isAdmin = Auth::user()->can('do-arbitrary-admin-task');
        $ns = $isAdmin ? 'Admin' : 'NonAdmin';
        $controller = app()->make("{$ns}\\IndexController");
        return $controller->callAction('index', $parameters = []);
    });
});

【讨论】:

  • 谢谢,服务类是指中间件?
  • 不,我的意思是服务类:从控制器中抽象出业务逻辑的类。
  • 你有这样一个类的例子吗?我也有同样的问题,谢谢!
  • Here's an example using Lumen。基本上,您可以使用 Service Provider 来告诉 Laravel 的 IoC 容器如何处理依赖注入。 Laravel 和 Lumen 对 Service Providers 的注册略有不同,但相差不大。使用 Laravel,你在 config/app.php 文件中注册每个服务提供者,而使用 Lumen,你在 bootstrap/app.php 文件中注册它们。
猜你喜欢
  • 1970-01-01
  • 2019-04-08
  • 2020-08-31
  • 2019-08-30
  • 1970-01-01
  • 2019-11-26
  • 2021-05-11
  • 1970-01-01
  • 2017-08-06
相关资源
最近更新 更多