アプリケーション内でユーザーができること、できないことを制御することは、実際のアプリケーションを構築するときに行う必要がある最も重要なことの 1 つです。
たとえば、todo アプリケーションでは、ユーザーが他のユーザーの todo を編集または削除できないようにする必要があります。
この記事では、シンプルな ToDo アプリケーションを構築することでユーザーが実行できる内容をポリシーを使用して制御することにより、Laravel でこれを行うシームレスな方法の 1 つを学習します。
このチュートリアルを進めるには、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 プロパティを使用してフォームを送信できるようになります。また、ユーザーと Todo の関係も定義します。この場合、todo はユーザーに属します。次のコードを App/Models/User.php ファイルに追加して、関係のセットアップを完了しましょう:
public function todos() { return $this->hasMany(Todo::class); }
上記のコードは、User モデルを Todo モデルに接続して、多くの ToDo を含めることができるようにします。
Laravel での移行は、データベーステーブルに何を含めるべきかを指定するために使用されます。次のコマンドを実行して、database/migrations フォルダー内に移行を作成します:
composer create-project laravel/laravel todo-app && cd todo-app
次に、新しいファイルの up 関数を次の関数に置き換えます。これにより、id、user_id、title、description、completed、timestamp 列を含む todo テーブルがデータベースに追加されます。
php artisan breeze:install
次に、次のコマンドを実行して、todos テーブルをデータベースに追加します。
npm install && npm run dev
Laravel のポリシーを使用すると、特定のリソース (この場合は todo) に対して誰が何をできるかを定義できます。
次のコマンドを使用して App/Policies フォルダー内に TodoPolicy を生成して、その仕組みを見てみましょう:
php artisan migrate
次に、新しく作成した TodoPolicy ファイルで、TodoPolicy クラスを次のコードに置き換えます。
php artisan serve
上記のコードは、ユーザーが Todo を作成できるが、自分に属する Todo の表示、更新、削除のみができることを指定しています。
次に、次のセクションでコントローラーを設定しましょう。
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); } }
index メソッドを、ログインしているすべてのユーザーの todo を取得して返す次のコードに置き換えます。
public function todos() { return $this->hasMany(Todo::class); }
Gate::authorize メソッドは、前のセクションで定義した viewAny ポリシー メソッドを使用してユーザーがログインしていることを検証します。
ユーザーが todo を作成できるように、create todo フォームをユーザーに返す前に、ユーザーがサインインしていることを検証する次のコードで create メソッドを置き換えます。
php artisan make:migration create_todos_table
ストア メソッドを次のコードに置き換えます。このコードは、ユーザーが Todo を作成できるかどうかを確認し、リクエストを検証して、ToDo を作成し、ユーザーを Todo リスト ページにリダイレクトします。
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(); }); }
編集メソッドを次のコードに置き換えます。このコードは、選択した Todo が入力された ToDo 編集フォームをユーザーに返して編集できるようにする前に、ユーザーがその Todo を編集できることを検証します。
php artisan migrate
更新メソッドを次のコードに置き換えます。このコードは、ユーザーが Todo を更新できるかどうかを確認し、リクエストを検証し、選択した Todo を更新して、ユーザーを Todo リスト ページにリダイレクトします。
php artisan make:policy TodoPolicy --model=Todo
destroy メソッドを次のコードに置き換えます。このコードは、ユーザーが Todo を削除できるかどうかを確認し、削除して、ユーザーを Todo リスト ページにリダイレクトします。
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
TodoController のルートの処理は、Laravel のリソース メソッドを使用することで比較的簡単です。これを行うには、次のように、routes/web.php フォルダーの末尾に次のコードを追加します。
php artisan serve
上記のコードは、認証ミドルウェアを使用して todos リソースを保護します。ログイン後、アプリケーションで次のルートにアクセスできるようになります:
Todo を作成、編集、削除できるようになりました。ただし、編集と削除の場合は、ログイン ユーザーおよび選択した Todo の所有者としてのみ実行できます。
それで終わりです!ユーザーが自分の Todo のみを作成、表示、編集、削除できる、現実的な Todo アプリケーションが作成されました。修正、提案、質問がありましたら、コメント欄でお知らせください。
最後に、Dev、LinkedIn、Twitter で私をフォローしてください。読んでいただきありがとうございました。また次回でお会いしましょう!
以上が認可: Laravel のポリシーを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。