Laravel - Guest User Gates:初學者指南

你好,有抱負的開發者們!今天,我們將深入 Laravel 的世界,探討一個非常有趣的觀念——訪客用戶閘門(Guest User Gates)。別擔心你對編程還是新手——我會一步步地解析所有內容,就像這些年來我對無數學生所做的一樣。所以,來一杯咖啡,讓我們一起踏上這個令人興奮的旅程!

Laravel - Guest User Gates

訪客用戶閘門是什麼?

在我們進入代碼之前,讓我們先了解訪客用戶閘門是什麼。想像你在家里辦一個派對。對你的親密朋友和不太熟悉的客人,你有不同的規則。Laravel 中的訪客用戶閘門與此類似——它們幫助你為未登錄應用程序的用户設定規則。

我們為什麼需要訪客用戶閘門?

你可能會想,"為什麼要麻煩處理訪客用户?我們不能把所有東西都設為公共的嗎?" 嗯,我的年輕學徒,在網頁開發中,安全性是至關重要的。訪客用戶閘門讓我們能夠控制匿名用户在我們應用程序中能夠和不能夠做什麼,讓我們的數字派對對每個人來說都是安全且有趣的!

設置訪客用戶閘門

現在,讓我們捋起袖子,開始編寫一些代碼。別擔心起初看起來令人生畏——我們會一行一行地走過。

步驟 1:定義閘門

首先,我們需要定義我們的閘門。在 Laravel 中,我們通常在 AuthServiceProvider.php 文件中完成這一步。這是它的樣子:

use Illuminate\Support\Facades\Gate;

public function boot()
{
$this->registerPolicies();

Gate::define('view-post', function (?User $user) {
return true;
});
}

讓我們分解一下:

  1. 我們使用 Gate 當前,它提供了一種簡單的方式來在 Laravel 中授權行動。
  2. boot 方法內,我們定義了一個名為 'view-post' 的新閘門。
  3. ?User $user 參數允許這個閘門對於經過身份驗證和訪客用户都可用。
  4. 當前,我們返回 true,這意味著所有人(包括訪客)都可以查看帖子。

步驟 2:在控制器中使用閘門

現在,我們已經定義了閘門,讓我們在控制器中使用它:

use Illuminate\Support\Facades\Gate;

public function show(Post $post)
{
if (Gate::allows('view-post')) {
return view('posts.show', compact('post'));
}

abort(403);
}

這裡發生了什麼:

  1. 我們正在檢查當前用户(訪客或經過身份驗證)是否被允許查看帖子。
  2. 如果允許,我們返回帶有帖子的視圖。
  3. 如果不允許,我們終止並返回 403(禁止)錯誤。

步驟 3:為閘門添加邏輯

讓我們使閘門更聰明一些。我們將允許訪客僅查看已發布的帖子:

Gate::define('view-post', function (?User $user, Post $post) {
return $post->published_at !== null;
});

現在,我們的閘門接受兩個參數:

  1. 用户(對於訪客可能為 null)
  2. 我們試圖查看的特定帖子

我們檢查帖子是否有 published_at 日期。如果有,則帖子可被訪客查看。

步驟 4:更新控制器

讓我們更新我們的控制器以使用這個新邏輯:

public function show(Post $post)
{
if (Gate::allows('view-post', $post)) {
return view('posts.show', compact('post'));
}

abort(403);
}

這裡唯一的改變是我們將 $post 傳遞給 Gate::allows() 方法。

高級訪客用戶閘門

現在您已經掌握了基礎,讓我們看看一些更先進的技術。

結合訪客和經過身份驗證用户的邏輯

有時候,您對訪客和經過身份驗證的用户有不同的規則。這是我們如何做到這一點:

Gate::define('view-post', function (?User $user, Post $post) {
if ($user === null) {
return $post->published_at !== null;
}

return $user->id === $post->user_id || $post->published_at !== null;
});

在這個例子中:

  • 訪客只能查看已發布的帖子
  • 經過身份驗證的用户可以查看他們自己的帖子(即使未發布)和任何已發布的帖子

在 Blade 模板中使用閘門

閘門不僅僅用於控制器!您也可以在您的 Blade 模板中使用它們:

@can('view-post', $post)
<h1>{{ $post->title }}</h1>
<p>{{ $post->content }}</p>
@else
<p>對不起,您無法查看這個帖子。</p>
@endcan

這使您的模板更加動態和安全。

訪客用戶閘門的最佳實踐

當我們結束這個話題時,讓我們談談我這些年來學到的最佳實踐:

  1. 保持簡單:從簡單的閘門開始,根據需要增加複雜性。
  2. 明確:總是檢查權限,即使您認為路徑是公共的。
  3. 使用策略類:對於複雜的授權邏輯,考慮使用策略類而不是內聯閘門。
  4. 測試您的閘門:為訪客和經過身份驗證的用户編寫測試,確保閘門的行為正確。

結論

恭喜你!你剛剛踏出了進入 Laravel 訪客用戶閘門世界的第一步。記住,就像學騎自行車一樣,起初可能會感到搖搖晃晃,但隨著練習,你會很快馳騁自如。

這裡是我們已經介紹過的方法的快速參考表:

方法 描述
Gate::define() 定義一個新的閘門
Gate::allows() 檢查閘門是否允許一個行動
@can Blade 指令用於閘門檢查

繼續編碼,繼續學習,最重要的是,玩得開心!誰知道呢?也許有一天你會成為教導新一代開發者 Laravel 奇迹的人。直到下一次,快樂編碼!

Credits: Image by storyset