laravel 5.2 中特定路由的 web 中间件

Posted

技术标签:

【中文标题】laravel 5.2 中特定路由的 web 中间件【英文标题】:web middleware for specific routes in laravel 5.2 【发布时间】:2017-07-23 11:00:38 【问题描述】:

在 Laravel 5.4 中,Web 中间件默认包含在所有路由中。但我想显示分配给用户的那些路线(菜单)。例如 我有一些路线(菜单)如下

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

如果用户 'ABC' 只分配两条路线(菜单),如

`user\list`
`user\add`

因此,当用户“ABC”登录时,菜单中仅显示两条分配的路线(菜单)。当用户创建那个时间时,我分配路线(菜单)并将其存储在权限表中。现在我的问题是如何使用中间件来处理这个问题。 这是否可能通过中间件处理。请建议我 提前致谢

【问题讨论】:

【参考方案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 并将其作为$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 的列用于存储锚链接的文本。如果没有,您可以考虑添加这些。

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

希望这会有所帮助。

【讨论】:

以上是关于laravel 5.2 中特定路由的 web 中间件的主要内容,如果未能解决你的问题,请参考以下文章

身份验证控制器中的 Laravel 5.2 Web 中间件导致 csrf 令牌不匹配

Laravel 5.2 - 在中间件请求中获取路由组名称

在 Laravel 5 中,如何禁用特定路由的 VerifycsrfToken 中间件?

Laravel 5.2 会话闪存即使使用 Web 中间件也无法正常工作

中间件身份验证不适用于 Web Laravel 5.2

无法在Laravel 5.2中的中间件中注入依赖项