はじめに
LaravelのTODOアプリを作成しながら、Bladeによるタスク画面、管理者専用機能、シーダーについて学習したので、自分用の復習問題としてまとめます。
今回は、特に重要な内容を10問に絞って復習します。
① タスク一覧とフォーム
Q1. 次のrequest('search')にはどのような役割がある?
<input type="text" name="search" value="{{ request('search') }}">
答えを見る
URLのsearchクエリパラメータを取得し、検索後も入力したキーワードをフォームに表示しておく。
Q2. 次のコードは何をする?
{{ Str::limit($task->description, 100) }}
答えを見る
タスクの説明を最大100文字に省略して表示する。
長い説明によって一覧画面が読みにくくなるのを防げる。
Q3. 次の比較では背景色が正しく付かない。原因は何?
public function getPriorityColor(): string
{
return match ($this->priority) {
'high' => 'red',
'medium' => 'yellow',
'low' => 'green',
};
}
{{ $task->getPriorityColor() == 'high' ? 'bg-red-100' : '' }}
答えを見る
メソッドが返すのはred、yellow、greenだが、Blade側ではhighと比較しているため。
例えば、次のように戻り値と同じ値で比較する。
{{ $task->getPriorityColor() == 'red' ? 'bg-red-100' : '' }}
Q4. 編集フォームで次のように書く理由は?
value="{{ old('title', $task->title) }}"
答えを見る
通常は現在のタスク名を表示し、バリデーションエラー後はユーザーが直前に入力した値を優先して再表示するため。
Q5. ファイルを送信するフォームに必要な属性は?
答えを見る
enctype="multipart/form-data"が必要。
<form method="POST" enctype="multipart/form-data">
これがないと、選択した画像ファイルを正しく送信できない。
② 操作権限と管理者機能
Q6. 削除フォームで@csrfと@method('DELETE')を使う理由は?
答えを見る
-
@csrf:正規のフォームから送られたリクエストか確認するため -
@method('DELETE'):HTMLフォームでは直接指定できないDELETEリクエストとしてLaravelに扱わせるため
Q7. Bladeで編集ボタンを隠すだけで、アクセス制御は十分?
@if($task->user_id == auth()->id())
<a href="{{ route('tasks.edit', $task) }}">編集</a>
@endif
答えを見る
不十分。
URLやリクエストを直接操作される可能性があるため、コントローラー、Policy、ミドルウェアなどを使ってサーバー側でも所有者かどうかを確認する必要がある。
Q8. 次のルートグループでは、ルート名とURLに何が追加される?
Route::middleware(['auth', 'admin'])
->prefix('admin')
->name('admin.')
->group(function () {
Route::get('/dashboard', ...)->name('dashboard');
});
答えを見る
- URL:
/admin/dashboard - ルート名:
admin.dashboard
さらに、ログイン済みかつ管理者であることがアクセス条件になる。
Q9. 次のwithCount('tasks')は何をする?
$users = User::withCount('tasks')->latest()->get();
答えを見る
各ユーザーに関連するタスク数をまとめて取得し、$user->tasks_countで参照できるようにする。
ユーザーごとにタスク一覧を取得して数える必要がないため、効率よく件数を表示できる。
③ シーダー
Q10. DatabaseSeederでUserSeederをTaskSeederより先に実行する理由は?
$this->call([
UserSeeder::class,
TaskSeeder::class,
]);
答えを見る
タスクを作成するには、関連付けるユーザーが先にデータベースへ存在している必要があるため。
なお、php artisan migrate:fresh --seedは既存のテーブルを削除して作り直すため、データを消してよい開発環境などで使用する。
まとめ
今回、特に覚えておきたいのは次の5つです。
-
request()やold()でフォームの入力状態を保持できる - 画像フォームには
multipart/form-dataが必要 - ボタンを隠すだけでなく、サーバー側でも権限を確認する
-
prefix()とname()で管理者用ルートを整理できる - 関連データを作るシーダーは実行順序に注意する