我想根据登录的用户角色名称创建动态前缀名称,例如,对于相同的路由组,如果admin登录到管理面板,则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');
});当用户成功登录时,我根据用户角色需要不同的前缀时,管理员和经销商的路由组基本上是相同的
发布于 2020-09-07 14:08:42
注意:这是对你正在做的事情做了一些假设。
在注册路由之前,您将无法访问有关当前用户的信息。直到请求被分派到路由并通过将启动会话的中间件堆栈之后,会话才会启动。这是一个关于如何以一种对事件顺序有意义的方式来实现这一点的想法。
您应该使用动态前缀设置路由组:
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都将具有这个前缀,并且您不必为它传递一个参数。我们还将从路由中删除前缀参数,这样它就不会传递给您的操作:
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');注意:这个中间件可以以更广泛的方式应用,但是如果有人没有登录,您需要知道这个参数的默认值是什么。这还假设您在该路由组中可能有多个路由。如果只有一条路由,那么可以稍微调整一下。
发布于 2020-09-07 14:14:18
这是一个普通的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');
});https://stackoverflow.com/questions/63771834
复制相似问题