0

在Laravel 5.4中,默认情况下,所有路由都包含web中间件。但我想显示这些路线(菜单)分配给用户。例如 我有一些路线(菜单的)如下,如果用户“ABC”分配只有两个途径(菜单的)像laravel中特定路由的web中间件5.2

`user\list` 
`user\add` 

所以当用户“ABC”被记录在菜单

user\list 
user\add 
user\show_form 
list\forms 

仅显示分配的两条路线(菜单)。当用户创建那个时候,我分配路线(菜单的),并且这存储在权限表中。现在我的问题是如何使用中间件来处理这个问题。 这是可能通过中间件处理。请推荐我 在此先感谢

回答

1

既然您从数据库中提取数据,我会做的就是跳过中间件的想法,并通过查询用户的路线并将其显示在页面上来解决这个问题。我会通过使用服务提供商来完成此任务。

让我们假设你的项目设置了一个包含用户导航元素的user-navigation.blade.php文件。也许是这样的:

<ul class="side-nav"> 
    <li> 
     <a href="/user/list">List</a> 
    </li> 
    <li> 
     <a href="/user/add">Add</a> 
    </li> 
</ul> 

而且你正在把这个文件到您的其他刀片服务器模板,@include('user-navigation')

我们想要做的是对当前用户的路线进行查询任何时候该视图(用户导航)显示给用户。我们可以通过服务提供商轻松完成此操作。

在终端中运行以下命令:php artisan make:provider UserNavigationServiceProvider。接下来,我们需要告诉Laravel实际使用这个服务提供者。打开config/app.php并向下滚动到“Application Service Providers”所在的区域,并添加以下内容:App\Providers\UserNavigationServiceProvider::class,。现在编辑app\Providers\UserNavigationServiceProvider.php中的文件

如果您使用的是Laravel的默认身份验证,请将其带入文件顶部:use Auth;。我们还需要为您的permissions表引入模型。因此,use App\Permission;也在这个文件的顶部。

现在,在boot()方法,使它看起来像这样:

public function boot() 
{ 
    $this->getUserNavigation(); 
} 

接下来,我们要创建getUserNavigation()方法。正下方register()方法,补充一点:

private function getUserNavigation() 
{ 
    view()->composer('user-navigation', function($view) 
    { 
     $userID = Auth::id(); 

     $userNavigation = ! is_null($userID) ? Provider::where('user_id', $userID)->get() : null; 

     $view->with([ 'userNavigation' => $userNavigation ]); 
    }); 
} 

所以让我们打破我们在这个新的方法做什么。首先,我们要说的是我们要以user-navigation这个名字为目标。任何时候这个视图都会被加载,我们将在这个闭包中执行逻辑。接下来,我们使用默认的Laravel Auth方式获取当前用户的ID,然后我们使用Eloquent在permissions表上运行查询。 注意:我假设您的permissions表中有一列是user_id。该查询为我们提供了该用户在permissions表中拥有的所有记录的集合。现在我们将该结果绑定到变量$userNavigation并将其作为$userNavigation传递给user-navigation注意:由于您在其他文件中包含user-navigation.blade.php,该文件也将有权访问此$userNavigation变量。

现在,在user-navigation.blade.php让我们写逻辑。首先我们检查一下该变量是否为null。如果您知道一个未登录的用户,您可以选择跳过此选项从不访问此视图。然后简单地遍历它并显示结果。

@if ($userNavigation) 
<ul class="side-nav"> 
    @foreach($userNavigation as $navItem) 
    <li> 
     <a href="{{ $navItem->url }}">{{ $navItem->url_name }}</a> 
    </li> 
    @endforeach 
</ul> 
@endif 

在上面的例子中,我假设有一个数据库列名为url你在哪里存储连接和一个叫url_name你在哪里存储的锚链接的文本列。如果没有,你可以考虑添加这些。

就是这样。您可以使用服务提供商在任何时候让您的视图文件访问某些数据。

希望这会有所帮助。