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对permissionstable进行查询。 注意: 我假设您的 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。如果没有,您可以考虑添加这些。

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

希望这对您有所帮助。