0

在Laravel 5.4中,默認情況下,所有路由都包含web中間件。但我想顯示這些路線(菜單)分配給用戶。例如 我有一些路線(菜單的)如下,如果用戶「ABC」分配只有兩個途徑(菜單的)像laravel中特定路由的web中間件5.2

`user\list` 
`user\add` 

所以當用戶「ABC」被記錄在菜單

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

僅顯示分配的兩條路線(菜單)。當用戶創建那個時候,我分配路線(菜單的),並且這存儲在權限表中。現在我的問題是如何使用中間件來處理這個問題。 這是可能通過中間件處理。請推薦我 在此先感謝

回答

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並向下滾動到「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你在哪裏存儲的錨鏈接的文本列。如果沒有,你可以考慮添加這些。

就是這樣。您可以使用服務提供商在任何時候讓您的視圖文件訪問某些數據。

希望這會有所幫助。