如何在laravel中为同一路由组动态设置前缀中的角色名称

如何在laravel中为同一路由组动态设置前缀中的角色名称,laravel,routes,roles,prefix,Laravel,Routes,Roles,Prefix,我想根据记录的用户角色名称创建动态前缀名称,就像为同一路由组创建一样 如果管理员在管理员面板中登录,则 类似url: http://localhost:8000/admin/dashboard 并且,如果经销商在管理面板中登录: http://localhost:8000/dealer/dashboard 我的路线是 Route::group(['prefix' => 'admin', 'as' => 'admin.', 'namespace' => 'Admin', 'm

我想根据记录的用户角色名称创建动态前缀名称,就像为同一路由组创建一样 如果管理员在管理员面板中登录,则 类似url:

http://localhost:8000/admin/dashboard
并且,如果经销商在管理面板中登录:

http://localhost:8000/dealer/dashboard
我的路线是

Route::group(['prefix' => 'admin', 'as' => 'admin.', 'namespace' => 'Admin', 'middleware' => ['auth', 'verified', 'preventBackHistory']], function () {
    Route::get('/dashboard', 'HomeController@index')->name('home');
});
基本上,我的路线组与管理员和经销商的路线组相同
当用户成功登录时,我希望根据用户角色使用不同的前缀。注意:这是对您正在做的事情的一些假设

在注册路由之前,您将无法访问有关当前用户的信息。直到请求被分派到路由并通过将启动会话的中间件堆栈之后,会话才开始。这是一个如何以符合事件顺序的方式实现这一目标的想法

应使用动态前缀设置管线组:

Route::group(['prefix' => '{roleBased}', 'as' => 'admin.', 'namespace' => 'Admin', 'middleware' => ['auth', 'verified', 'dealWithPrefix', 'preventBackHistory']], function () {
    Route::get('/dashboard', 'HomeController@index')->name('home');
});
然后在
RouteServiceProvider
中,您将为前缀参数
roleBased
添加一个约束,以仅允许其为
admin
client

public function boot()
{
    // restrict the prefix to only be 'admin' or 'dealer'
    \Route::pattern('roleBased', 'admin|dealer');

    parent::boot();
}
现在,您必须创建一个中间件来处理获取当前用户的信息以设置此前缀的默认值,这样您生成的任何指向这些路由的URL都将具有此前缀,并且您不必为其传递参数。我们还将从路由中删除prefix参数,以便它不会传递给您的操作:

public function handle($request, $next)
{
    $role = $request->user()->role; // hopefully 'admin' | 'client'

    // setting the default for this parameter for the current user's role
    \URL::defaults([
        'roleBased' => $role
    ]);

    // to stop the router from passing this parameter to the actions
    $request->route()->forgetParameter('roleBased');
    
    return $next($request);
}
在内核中将此中间件注册为
dealWithPrefix
。注意:在上面的路由组中,该中间件被添加到中间件列表中

如果需要生成指向该组中任何路由的URL,并且当前请求不是该组中的路由之一,则在生成URL时,需要为该前缀传递一个参数:

route('admin.home', ['roleBased' => ...]);
如果请求当前针对该组中的一条路由,则无需添加此参数:

route('admin.home');

注意:这个中间件可以以更广泛的方式应用,但是如果没有人登录,您需要知道这个参数的默认值。这也是假设您在该路由组中可能有不止一条路由。如果它只是一个单独的路由,那么这可能会稍微调整。

这是一个普通的php文件,所以您可以添加

if(...){ // if admin
    $prefix = 'admin';
}else{ // if dealer
    $prefix = 'dealer';
}
在路线之前和路线中:

Route::group(['prefix' => $prefix, 'as' => $prefix.'.', 'namespace' => ucwords($prefix), 'middleware' => ['auth', 'verified', 'preventBackHistory']], function () {
    Route::get('/dashboard', 'HomeController@index')->name('home');
});

欢迎来到苏。。。只要有两个组,就不需要以这种方式动态路由,但我只需要更改前缀,管理员和经销商的所有其他事情都是一样的。用户如何被定向到此路由?如果他们的路由中有这样的条件,他们将无法使用路由缓存,因为缓存路由时满足的任何条件都是缓存的路由