はじめに
LaravelでTODOアプリを作成しながら、Taskモデル、認証処理、検索・権限付きCRUDについて学習したので、自分用の復習問題としてまとめます。
今回は、特に重要な内容を10問に絞って復習します。
① Taskモデル
Q1. 次の $casts は何をする?
protected $casts = [
'due_date' => 'date',
'completed_at' => 'datetime',
];
答えを見る
due_dateとcompleted_atを日付オブジェクトとして扱えるようにする。
これにより、isPast()などの日付用メソッドを利用できる。
Q2. 次のメソッドがfalseを返すのはどのような場合?
public function isOverdue(): bool
{
if (!$this->due_date || $this->isCompleted()) {
return false;
}
return $this->due_date->isPast();
}
答えを見る
- 期限が設定されていない場合
- タスクが完了済みの場合
- 期限がまだ過ぎていない場合
未完了かつ期限を過ぎている場合だけtrueを返す。
Q3. 次のメソッドは何をする?
public function markAsCompleted(): void
{
$this->update([
'status' => 'completed',
'completed_at' => now(),
]);
}
答えを見る
タスクの状態を完了に変更し、完了した日時も同時に保存する。
モデルにまとめることで、同じ完了処理を再利用しやすくなる。
② 認証処理
Q4. バリデーションのconfirmedルールは何を確認する?
'password' => 'required|string|min:8|confirmed',
答えを見る
passwordとpassword_confirmationの値が一致しているか確認する。
Q5. ログイン成功後に次の処理を行う理由は?
$request->session()->regenerate();
答えを見る
セッションIDを新しくし、セッション固定攻撃を防ぐため。
Q6. ログアウト時の3つの処理には、それぞれどのような役割がある?
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
答えを見る
-
logout():認証状態を解除する -
invalidate():現在のセッションを無効にする -
regenerateToken():CSRFトークンを新しくする
③ 検索・権限付きCRUD
Q7. 次の条件分岐は、一般ユーザーと管理者の取得対象をどう分けている?
if (!auth()->user()->isAdmin()) {
$query->where('user_id', auth()->id());
} else {
$query->with('user');
}
答えを見る
- 一般ユーザー:自分が所有するタスクだけを取得する
- 管理者:全タスクを対象とし、所有者情報もEager Loadingする
Q8. キーワード検索でwhere()の中に無名関数を使う理由は?
$query->where(function ($q) use ($request) {
$q->where('title', 'like', '%' . $request->search . '%')
->orWhere('description', 'like', '%' . $request->search . '%');
});
答えを見る
タイトルと説明のOR条件を、1つのグループとしてまとめるため。
他のステータス条件などと組み合わせても、意図しないデータが検索結果に混ざるのを防げる。
Q9. 次のwithQueryString()は何をする?
$tasks = $query->paginate(10)->withQueryString();
答えを見る
検索キーワードやフィルターなど、現在のクエリパラメータをページネーションリンクにも引き継ぐ。
そのため、次のページへ移動しても検索条件が消えない。
Q10. 次の書き方でuser_idを直接指定しなくてもよいのはなぜ?
auth()->user()->tasks()->create($validated);
答えを見る
ログインユーザーのtasks()リレーション経由で作成しているため、LaravelがそのユーザーのIDをuser_idへ自動的に設定する。
リクエストからuser_idを受け取らないため、別のユーザーIDを不正に指定されるリスクも減らせる。
まとめ
今回、特に覚えておきたいのは次の5つです。
-
$castsを使うと日付カラムを日付オブジェクトとして扱える - ログイン後はセッションIDを再生成する
- ログアウト時は認証解除・セッション無効化・CSRFトークン再生成を行う
- OR検索は無名関数でグループ化する
- リレーション経由で作成すると、所有者のIDを安全に設定できる