授權:了解 Laravel 中的策略

Linda Hamilton
發布: 2024-10-18 22:08:31
原創
341 人瀏覽過

控制使用者在應用程式中可以執行或不能執行的操作是建立實際應用程式時需要做的最重要的事情之一。

例如,在待辦事項應用程式中,您不希望使用者能夠編輯或刪除其他使用者的待辦事項。

在本文中,您將學習在 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 應用程序,如下所示:

Authorization: Understanding Policies in 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!