授權:了解 Laravel 中的策略
控制使用者在應用程式中可以執行或不能執行的操作是建立實際應用程式時需要做的最重要的事情之一。
例如,在待辦事項應用程式中,您不希望使用者能夠編輯或刪除其他使用者的待辦事項。
在本文中,您將學習在 Laravel 中實現此目的的無縫方法之一,即使用策略來控制使用者可以透過建立簡單的待辦事項應用程式執行哪些操作。
要學習本教程,您需要對 Laravel 及其應用程式結構有基本的了解。
創建基礎應用程式
執行以下命令在所需資料夾中建立一個新的 Laravel 應用程式並移入其中:
composer create-project laravel/laravel todo-app && cd todo-app
接下來,執行以下指令來安裝 Laravel Breeze:
php artisan breeze:install
Breeze 將透過身份驗證建立您的新應用程序,以便您的用戶可以註冊、登入、登出和查看他們的個人化儀表板。
之後,透過執行以下命令編譯您的應用程式資產:
npm install && npm run dev
Laravel 預設會附帶基於檔案的 SQLite 資料庫,因此您需要做的下一件事是將應用程式資料庫檔案連接到資料庫檢視器,例如 TablePlus 或任何其他您喜歡的資料庫檢視器。
將資料庫連接到檢視器後,執行以下命令將可用表遷移到資料庫:
php artisan migrate
完成後,執行以下命令在瀏覽器中查看您的應用程式:
php artisan serve
您現在應該在 localhost:8000 上看到新的 Laravel 應用程序,如下所示:
您現在可以前往註冊頁面以建立使用者並存取儀表板,這是此時的整個應用程式。
模型設定
Laravel 中的模型用於控制資料庫表。使用以下命令在 App/Models 資料夾中建立 Todo 模型:
php artisan make:model Todo
接下來,在新建立的檔案中,用以下程式碼取代 Todo 類別:
class Todo extends Model { use HasFactory; protected $fillable = [ 'title', 'description', 'completed', 'user_id' ]; public function user() { return $this->belongsTo(User::class); } }
上面的程式碼將使使用者能夠提交具有 $fillable 屬性的表單;它還定義了使用者和待辦事項之間的關係;在這種情況下,待辦事項屬於使用者。讓我們透過將以下程式碼新增至 App/Models/User.php 檔案來完成關係設定:
public function todos() { return $this->hasMany(Todo::class); }
上面的程式碼將 User 模型連接到 Todo 模型,以便它可以有很多待辦事項。
遷移設定
Laravel 中的遷移用於指定資料庫表中應包含的內容。執行以下命令在 database/migrations 資料夾中建立遷移:
composer create-project laravel/laravel todo-app && cd todo-app
接下來,將新檔案中的 up 函數替換為以下內容,該函數會將 todo 表格新增至資料庫中,其中包含 id、user_id、title、description、completed 和 timestamp 欄位:
php artisan breeze:install
接下來,執行以下命令將 todos 表加入資料庫:
npm install && npm run dev
策略設定
Laravel 中的策略可讓您定義誰可以使用特定資源(在本例中為待辦事項)執行哪些操作。
讓我們透過使用以下命令在 App/Policies 資料夾中產生 TodoPolicy 來看看它是如何運作的:
php artisan migrate
接下來,在新建立的 TodoPolicy 檔案中,將 TodoPolicy 類別替換為以下程式碼:
php artisan serve
上面的程式碼指定使用者可以建立待辦事項,但只能查看、更新或刪除屬於自己的待辦事項。
接下來,讓我們在下一節中設定控制器。
控制器設定
Laravel 中的控制器控制應用程式針對特定資源的功能。執行以下命令在 App/Http/Controllers 中產生 TodoController:
php artisan make:model Todo
在新建的TodoController檔案頂部新增以下程式碼,匯入用於資料庫操作的Todo模型和用於授權的Gate類別:
class Todo extends Model { use HasFactory; protected $fillable = [ 'title', 'description', 'completed', 'user_id' ]; public function user() { return $this->belongsTo(User::class); } }
指數法
將索引方法替換為以下程式碼,以取得並傳回所有登入使用者的待辦事項:
public function todos() { return $this->hasMany(Todo::class); }
Gate::authorize 方法驗證使用者是否使用您在上一節中定義的 viewAny 策略方法登入。
創建方法
將 create 方法替換為以下程式碼,以驗證用戶是否已登錄,然後再將建立待辦事項表單回傳給用戶,以便他們可以建立待辦事項:
php artisan make:migration create_todos_table
儲存方式
用以下程式碼取代 store 方法,檢查使用者是否可以建立待辦事項、驗證要求、建立待辦事項並將使用者重新導向到待辦事項清單頁面:
public function up(): void { Schema::create('todos', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->string('title'); $table->text('description')->nullable(); $table->boolean('completed')->default(false); $table->timestamps(); }); }
編輯方法
將編輯方法替換為以下程式碼,以驗證用戶是否可以編輯該待辦事項,然後將填充了所選待辦事項的編輯待辦事項表單傳回給用戶,以便他們可以對其進行編輯:
php artisan migrate
更新方法
用以下程式碼取代 update 方法,檢查使用者是否可以更新待辦事項、驗證請求、更新選定的待辦事項並將使用者重新導向到待辦事項清單頁面:
php artisan make:policy TodoPolicy --model=Todo
銷毀方法
用以下程式碼取代 destroy 方法,檢查使用者是否可以刪除該待辦事項,刪除它,並將使用者重新導向到待辦事項清單頁面:
class TodoPolicy { /** * Determine if the user can view any todos. */ public function viewAny(User $user): bool { return true; } /** * Determine if the user can view the todo. */ public function view(User $user, Todo $todo): bool { return $user->id === $todo->user_id; } /** * Determine if the user can create todos. */ public function create(User $user): bool { return true; } /** * Determine if the user can update the todo. */ public function update(User $user, Todo $todo): bool { return $user->id === $todo->user_id; } /** * Determine if the user can delete the todo. */ public function delete(User $user, Todo $todo): bool { return $user->id === $todo->user_id; } }
您的 TodoController 檔案現在應如下所示:
composer create-project laravel/laravel todo-app && cd todo-app
視圖設定
現在您的 TodoController 方法已全部設定完畢,您現在可以透過在 resources/views 資料夾中建立新的 todos 資料夾來為您的應用程式建立視圖。之後,在新的todos資料夾中建立create.blade.php、edit.blade.php、index.blade.php檔案。
索引視圖
將以下程式碼貼到index.blade.php中:
php artisan breeze:install
建立視圖
將以下程式碼貼到 create.blade.php 中:
npm install && npm run dev
編輯視圖
將以下程式碼貼到 edit.blade.php 中:
php artisan migrate
路線設定
使用 Laravel 中的資源方法處理 TodoController 的路由相對簡單。透過將以下程式碼加入 paths/web.php 資料夾的末尾來實現此目的,如下所示:
php artisan serve
上面的程式碼使用了 auth 中間件來保護 todos 資源。登入後,您現在應該能夠在應用程式中存取以下路線:
- /todos: 列出所有使用者的待辦事項
- /todos/create: 顯示建立待辦事項的表單
- /todos/edit/1:顯示用於編輯給定 id 的待辦事項的表單;在本例中為 1。
您現在可以建立、編輯和刪除待辦事項,但在編輯和刪除時只能以登入使用者和所選待辦事項的所有者身分進行。
結論
就是這樣!您剛剛創建了一個真實的待辦事項應用程序,該應用程式允許用戶僅創建、查看、編輯和刪除自己的待辦事項。如果您有任何更正、建議或問題,請在評論中告訴我!
最後,記得在 Dev、LinkedIn 和 Twitter 上追蹤我。非常感謝您的閱讀,我們下一篇再見!
以上是授權:了解 Laravel 中的策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

在PHP中,include,require,include_once,require_once的區別在於:1)include產生警告並繼續執行,2)require產生致命錯誤並停止執行,3)include_once和require_once防止重複包含。這些函數的選擇取決於文件的重要性和是否需要防止重複包含,合理使用可以提高代碼的可讀性和可維護性。

PHP中有四種主要錯誤類型:1.Notice:最輕微,不會中斷程序,如訪問未定義變量;2.Warning:比Notice嚴重,不會終止程序,如包含不存在文件;3.FatalError:最嚴重,會終止程序,如調用不存在函數;4.ParseError:語法錯誤,會阻止程序執行,如忘記添加結束標籤。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。
