laravel 5.2

时间:2017-03-03 11:00:25

标签: php laravel-5 laravel-routing middleware laravel-middleware

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

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

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

`user\list`
`user\add`

所以当用户' ABC'记录在菜单中仅显示两个路径(菜单' s)。当用户创建该时间时,我分配路径(菜单' s)并将其存储在权限表中。现在我的问题是如何使用中间件来处理这个问题。 这可能通过中间件处理。请建议我 提前致谢

1 个答案:

答案 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的列,您要在其中存储文本锚链接。如果没有,您可以考虑添加它们。

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

希望这有帮助。