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?

学習ログ #37|Laravelのタスク画面・管理者機能・シーダーを復習するための自分用問題集

0
Posted at

はじめに

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

  1. request()やold()でフォームの入力状態を保持できる
  2. 画像フォームにはmultipart/form-dataが必要
  3. ボタンを隠すだけでなく、サーバー側でも権限を確認する
  4. prefix()とname()で管理者用ルートを整理できる
  5. 関連データを作るシーダーは実行順序に注意する
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?