首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在laravel中为同一路由组动态设置前缀角色名称

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

Stack Overflow用户
提问于 2020-09-07 13:25:54
回答 2查看 687关注 0票数 0

我想根据登录的用户角色名称创建动态前缀名称,例如,对于相同的路由组,如果admin登录到管理面板,则url如下:

代码语言:javascript
复制
http://localhost:8000/admin/dashboard

而且,如果经销商登录到管理面板:

代码语言:javascript
复制
http://localhost:8000/dealer/dashboard

我的路由组是

代码语言:javascript
复制
Route::group(['prefix' => 'admin', 'as' => 'admin.', 'namespace' => 'Admin', 'middleware' => ['auth', 'verified', 'preventBackHistory']], function () {
    Route::get('/dashboard', 'HomeController@index')->name('home');
});

当用户成功登录时,我根据用户角色需要不同的前缀时,管理员和经销商的路由组基本上是相同的

EN

回答 2

Stack Overflow用户

发布于 2020-09-07 14:08:42

注意:这是对你正在做的事情做了一些假设。

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

您应该使用动态前缀设置路由组:

代码语言:javascript
复制
Route::group(['prefix' => '{roleBased}', 'as' => 'admin.', 'namespace' => 'Admin', 'middleware' => ['auth', 'verified', 'dealWithPrefix', 'preventBackHistory']], function () {
    Route::get('/dashboard', 'HomeController@index')->name('home');
});

然后,在RouteServiceProvider中,您将为前缀添加一个约束,即参数roleBased,以仅允许其为adminclient

代码语言:javascript
复制
public function boot()
{
    // restrict the prefix to only be 'admin' or 'dealer'
    \Route::pattern('roleBased', 'admin|dealer');

    parent::boot();
}

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

代码语言:javascript
复制
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时将需要传递此前缀的参数:

代码语言:javascript
复制
route('admin.home', ['roleBased' => ...]);

如果当前请求是针对该组中的某个路由,则不需要添加此参数:

代码语言:javascript
复制
route('admin.home');

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

票数 0
EN

Stack Overflow用户

发布于 2020-09-07 14:14:18

这是一个普通的php文件,所以你只需要添加

代码语言:javascript
复制
if(...){ // if admin
    $prefix = 'admin';
}else{ // if dealer
    $prefix = 'dealer';
}

在你的路线之前,在你的路线中:

代码语言:javascript
复制
Route::group(['prefix' => $prefix, 'as' => $prefix.'.', 'namespace' => ucwords($prefix), 'middleware' => ['auth', 'verified', 'preventBackHistory']], function () {
    Route::get('/dashboard', 'HomeController@index')->name('home');
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63771834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档