注意:这是对您所做的事情的一些假设。
在注册路由之前,您将无法访问有关当前用户的信息。直到请求被分派到路由并通过将启动会话的中间件堆栈之后,会话才开始。这是一个关于如何以对事件顺序有意义的方式实现这一目标的想法。
您应该使用动态前缀设置路由组:
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');
注意:这个中间件可以以更广泛的方式应用,但是如果有人没有登录,你需要知道你想为这个参数使用什么默认值。这也是假设你可能有不止 1 个路由那个路由组。如果只有那一条路线,那大概可以稍微调整一下。