laravel 5.2 中特定路由的网络中间件
web middleware for specific routes in laravel 5.2
在Laravel 5.4中,web中间件默认包含在所有路由中。但我想显示那些分配给用户的路线(菜单)。例如
我有一些路线(菜单)如下
user\list
user\add
user\show_form
list\forms
如果用户 'ABC' 仅分配两条路线(菜单),如
`user\list`
`user\add`
因此,当用户 'ABC' 登录时,菜单中仅显示分配的两条路线(菜单)。当用户创建那个时候我分配路线(菜单)并将其存储在权限 table 中。现在我的问题是如何使用中间件处理这个问题。
这是否可能通过中间件处理。请给我建议
提前致谢
由于您是从数据库中提取数据,所以我会做的是一起跳过中间件的想法,并通过查询用户的路由然后在页面上显示它们来解决这个问题。我将通过使用服务提供商来完成此任务。
假设您的项目设置了一个包含用户导航元素的 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')
.
将该文件导入到您的另一个 blade 模板中
我们想要做的是在向用户显示视图 (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
table 导入模型。所以把 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
table进行查询。 注意: 我假设您的 permissions
table 中有一列是 user_id
。该查询为我们提供了 permissions
table 中该用户拥有的所有记录的 collection。现在我们将该结果绑定到变量 $userNavigation
并将其作为 $userNavigation
传递给 user-navigation
。 注意: 因为您将 user-navigation.blade.php
包含在另一个文件中,所以该文件也可以访问此 $userNavigation
变量。
现在,在user-navigation.blade.php
中让我们编写逻辑。首先,我们检查该变量是否为 null
。如果您知道用户中的 non-logged 将 永远不会 访问此视图,您可以选择跳过此步骤。然后简单地循环它并显示结果。
@if ( $userNavigation )
<ul class="side-nav">
@foreach( $userNavigation as $navItem )
<li>
<a href="{{ $navItem->url }}">{{ $navItem->url_name }}</a>
</li>
@endforeach
</ul>
@endif
在上面的例子中,我假设你有一个名为url
的数据库列,你存储link和一个名为[=39的列=] 用于存储锚文本的位置 link。如果没有,您可以考虑添加这些。
就是这样。您可以使用服务提供商让您的视图文件在任何时候访问某些数据。
希望这对您有所帮助。
在Laravel 5.4中,web中间件默认包含在所有路由中。但我想显示那些分配给用户的路线(菜单)。例如 我有一些路线(菜单)如下
user\list
user\add
user\show_form
list\forms
如果用户 'ABC' 仅分配两条路线(菜单),如
`user\list`
`user\add`
因此,当用户 'ABC' 登录时,菜单中仅显示分配的两条路线(菜单)。当用户创建那个时候我分配路线(菜单)并将其存储在权限 table 中。现在我的问题是如何使用中间件处理这个问题。 这是否可能通过中间件处理。请给我建议 提前致谢
由于您是从数据库中提取数据,所以我会做的是一起跳过中间件的想法,并通过查询用户的路由然后在页面上显示它们来解决这个问题。我将通过使用服务提供商来完成此任务。
假设您的项目设置了一个包含用户导航元素的 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')
.
我们想要做的是在向用户显示视图 (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
table 导入模型。所以把 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
table进行查询。 注意: 我假设您的 permissions
table 中有一列是 user_id
。该查询为我们提供了 permissions
table 中该用户拥有的所有记录的 collection。现在我们将该结果绑定到变量 $userNavigation
并将其作为 $userNavigation
传递给 user-navigation
。 注意: 因为您将 user-navigation.blade.php
包含在另一个文件中,所以该文件也可以访问此 $userNavigation
变量。
现在,在user-navigation.blade.php
中让我们编写逻辑。首先,我们检查该变量是否为 null
。如果您知道用户中的 non-logged 将 永远不会 访问此视图,您可以选择跳过此步骤。然后简单地循环它并显示结果。
@if ( $userNavigation )
<ul class="side-nav">
@foreach( $userNavigation as $navItem )
<li>
<a href="{{ $navItem->url }}">{{ $navItem->url_name }}</a>
</li>
@endforeach
</ul>
@endif
在上面的例子中,我假设你有一个名为url
的数据库列,你存储link和一个名为[=39的列=] 用于存储锚文本的位置 link。如果没有,您可以考虑添加这些。
就是这样。您可以使用服务提供商让您的视图文件在任何时候访问某些数据。
希望这对您有所帮助。