既然您從數據庫中提取數據,我會做的就是跳過中間件的想法,並通過查詢用戶的路線並將其顯示在頁面上來解決這個問題。我會通過使用服務提供商來完成此任務。
讓我們假設你的項目設置了一個包含用戶導航元素的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
你在哪裏存儲的錨鏈接的文本列。如果沒有,你可以考慮添加這些。
就是這樣。您可以使用服務提供商在任何時候讓您的視圖文件訪問某些數據。
希望這會有所幫助。