既然您从数据库中提取数据,我会做的就是跳过中间件的想法,并通过查询用户的路线并将其显示在页面上来解决这个问题。我会通过使用服务提供商来完成此任务。
让我们假设你的项目设置了一个包含用户导航元素的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
你在哪里存储的锚链接的文本列。如果没有,你可以考虑添加这些。
就是这样。您可以使用服务提供商在任何时候让您的视图文件访问某些数据。
希望这会有所帮助。