在Laravel 5.4中,默认情况下,Web中间件包含在所有路由中。但我想显示分配给用户的那些路线(菜单' s)。例如 我有一些路线(菜单' s)如下
user\list
user\add
user\show_form
list\forms
如果用户' ABC'只分配两个路线(菜单' s),如
`user\list`
`user\add`
所以当用户' ABC'记录在菜单中仅显示两个路径(菜单' s)。当用户创建该时间时,我分配路径(菜单' s)并将其存储在权限表中。现在我的问题是如何使用中间件来处理这个问题。 这可能通过中间件处理。请建议我 提前致谢
答案 0 :(得分: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
并向下滚动到“应用服务提供商”所在的区域。并添加: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
并将其作为user-navigation
传递给$userNavigation
。 请注意:由于您将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
的列,您要在其中存储文本锚链接。如果没有,您可以考虑添加它们。
就是这样。您可以使用服务提供商在您的视图文件使用时随时访问某些数据。
希望这有帮助。