控制使用者在應用程式中可以執行或不能執行的操作是建立實際應用程式時需要做的最重要的事情之一。
例如,在待辦事項應用程式中,您不希望使用者能夠編輯或刪除其他使用者的待辦事項。
在本文中,您將學習在 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 資源。登入後,您現在應該能夠在應用程式中存取以下路線:
您現在可以建立、編輯和刪除待辦事項,但在編輯和刪除時只能以登入使用者和所選待辦事項的所有者身分進行。
就是這樣!您剛剛創建了一個真實的待辦事項應用程序,該應用程式允許用戶僅創建、查看、編輯和刪除自己的待辦事項。如果您有任何更正、建議或問題,請在評論中告訴我!
最後,記得在 Dev、LinkedIn 和 Twitter 上追蹤我。非常感謝您的閱讀,我們下一篇再見!
以上是授權:了解 Laravel 中的策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!