【问题标题】:Laravel 7 - Why i can't using the same route in different group of routing?Laravel 7 - 为什么我不能在不同的路由组中使用相同的路由?
【发布时间】:2021-02-28 11:24:15
【问题描述】:

所以我的路线中有这段代码:

// Facilitator Priviledges
    Route::group(['roles'=>'facilitator'],function(){

        //Material
        Route::get('/material', 'MaterialController@index');
        Route::post('/material', 'MaterialController@store');
        Route::get('/material/{course:id}/create', 'MaterialController@create');
        Route::get('/material/detail/{course:id}', 'MaterialController@show');
        Route::get('/material/{material:id}/edit', 'MaterialController@edit');
        Route::patch('/material/{material:id}', 'MaterialController@update');
        Route::delete('/material/{material:id}', 'MaterialController@destroy');


    });

    //Admin Priviledges
    Route::group(['roles'=>'admin'],function(){
        Route::resource('/categories', 'CategoriesController');  

        //Material
        Route::get('/material', 'MaterialController@index');
        Route::post('/material', 'MaterialController@store');
        Route::get('/material/{course:id}/create', 'MaterialController@create');
        Route::get('/material/detail/{course:id}', 'MaterialController@show');
        Route::get('/material/{material:id}/edit', 'MaterialController@edit');
        Route::patch('/material/{material:id}', 'MaterialController@update');
        Route::delete('/material/{material:id}', 'MaterialController@destroy');
    });

它具有相同的路由,在这种情况下,Material 路由管理员和促进者角色都可以访问它,但是当代码运行时它只能是一个工作正常的角色(我是使用管理员)和其他给出错误(503)服务不可用

【问题讨论】:

  • 因为 url 保持不变,您可以在视图或控制器中放置条件,以防不同角色执行此操作,或者为每个路由组添加前缀,
  • 因为它们是完全相同的 URI 和方法,只能注册 1 个匹配 URI 和方法组合的路由...路由组不存在,它们只是一个概念...所有路由单独注册;注册后没有组的概念
  • 那么,我应该在哪里使用条件来解决我的路由问题?
  • 好吧,那里没有条件,您只是将一条额外的数据传递给每个名为 'roles' 的路线 .... 为重叠路线创建一个具有 'roles' => ['facilitator', 'admin'] 的组...因为您似乎想要这些路由的两个角色,除了最后一组中的 1 个资源(将其从组中取出)......路由组只是“级联”配置的一种方式
  • 您也可以嵌套组以使roles 级联,因此它将它们一起添加到内部组中,但您仍然只会在内部组中拥有所有那些重叠的路线跨度>

标签: laravel routes middleware


【解决方案1】:

你可以参考这个Question

或者你可以参考Laravel Policy

或者您可以简单地创建自己的策略并将其注册到您的中间件中。

Route::group(['middleware' => ['admin', 'facilitator']], function () {
   Route::get('/material', 'MaterialController@index');
   Route::post('/material', 'MaterialController@store');
   Route::get('/material/{course:id}/create', 'MaterialController@create');
   Route::get('/material/detail/{course:id}', 'MaterialController@show');
   Route::get('/material/{material:id}/edit', 'MaterialController@edit');
   Route::patch('/material/{material:id}', 'MaterialController@update');
   Route::delete('/material/{material:id}', 'MaterialController@destroy');
});

【讨论】:

  • 我只是使用这个语法:Route::group(['roles'=> ['facilitator','admin']],function(){ ...} 所以我才意识到我的中间件可以同时处理两个数组
  • 是的,它还可以处理一系列函数...您的逻辑可以在其中执行
【解决方案2】:

如果你想使用组的级联能力,你可以这样嵌套它们:

Route::group(['roles'=>'admin'],function(){
    Route::resource('/categories', 'CategoriesController');  

    Route::group(['roles'=>'facilitator'],function(){
        Route::get('/material', 'MaterialController@index');
        Route::post('/material', 'MaterialController@store');
        Route::get('/material/{course:id}/create', 'MaterialController@create');
        Route::get('/material/detail/{course:id}', 'MaterialController@show');
        Route::get('/material/{material:id}/edit', 'MaterialController@edit');
        Route::patch('/material/{material:id}', 'MaterialController@update');
        Route::delete('/material/{material:id}', 'MaterialController@destroy');
    });
});

在内部组中roles['admin', 'facilitator']

【讨论】:

    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2020-08-19
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    相关资源
    最近更新 更多