0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

学習ログ #36|LaravelのTaskモデル・認証・CRUDを復習するための自分用問題集

0
Posted at

はじめに

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つです。

  1. $castsを使うと日付カラムを日付オブジェクトとして扱える
  2. ログイン後はセッションIDを再生成する
  3. ログアウト時は認証解除・セッション無効化・CSRFトークン再生成を行う
  4. OR検索は無名関数でグループ化する
  5. リレーション経由で作成すると、所有者のIDを安全に設定できる
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?