[Laravel挑戦] 実装練習3

起業準備

いよいよこの挑戦も終わりに近づいてきた。

今回はエディットボックスの入力値チェックと、データベース内のタスクの一覧/編集機能に進む。

入力値チェックはかんたんに

入力チェックは、ビューではなく、入力値を受け取る処理をする TaskController で実施する。

        $rules = [
            'task_name' => 'required|max:10',
        ];

        $messages = ['required' => '必須項目です', 'max' => '100文字以下にして'];

        Validator::make($request->all(),$rules,$messages)->validate();

今回のチュートリアルブログでは、こんな感じの書き方をしている。

読めば意味はわかるけど、他にどんなルール記載ができるのだろうか。

掘り下げようとしたけど、奥が深そうなので一旦撤退する。。

記載したルールから逸脱すると、makeメソッドの第3引数で指定したメッセージを表示する。

デフォルトのままでよければ特に記載しないでもいいらしい。英語だけど。

また、makeメソッドで作成されたValidatorのvalidateメソッドは、以下のようなものだ。

POSTされた値のバリデーションに成功するとコードは通常通り続けて実行され、バリデーションに失敗すると自動的に例外が投げられユーザーへ適切なエラーメッセージが返されるメソッド

つまりは、失敗すると処理は先に進まない(データベースへは書き込まれない)。

index()でタスク一覧を表示する

次に、TaskControllerの indexメソッドにタスク一覧表示する処理を加える。

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $tasks = Task::all();
        return view('tasks.index',compact('tasks'));
    }

compactは、変数名とその値から配列を作成するもので、[‘tasks’=>$tasks]と同じ意味らしい。

これでビューのindex処理に対してtasksが渡る。

index.blade.php では、以下のようにして tasks を受け取って、foreachで個数分の表示処理をする。

                {{-- 追記 --}}
  @if ($tasks->isNotEmpty())
      <div class="max-w-7xl mx-auto mt-20">
          <div class="inline-block min-w-full py-2 align-middle">
              <div class="overflow-hidden shadow ring-1 ring-black ring-opacity-5 md:rounded-lg">
                  <table class="min-w-full divide-y divide-gray-300">
                      <thead class="bg-gray-50">
                          <tr>
                              <th scope="col"
                                  class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900">
                                  タスク</th>
                              <th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-6">
                                  <span class="sr-only">Actions</span>
                              </th>
                          </tr>
                      </thead>
                      <tbody class="divide-y divide-gray-200 bg-white">
                          @foreach ($tasks as $item)
                              <tr>
                                  <td class="px-3 py-4 text-sm text-gray-500">
                                      <div>
                                          {{ $item->name }}
                                      </div>
                                  </td>
                                  <td class="p-0 text-right text-sm font-medium">
                                      <div class="flex justify-end">
                                          <div>
                                              <form action="/tasks/{{ $item->id }}"
                                                  method="post"
                                                  class="inline-block text-gray-500 font-medium"
                                                  role="menuitem" tabindex="-1">
                                                  @csrf
                                                  @method('PUT')
                                                  <button type="submit"
                                                      class="bg-emerald-700 py-4 w-20 text-white md:hover:bg-emerald-800 transition-colors">完了</button>
                                              </form>
                                          </div>
                                          <div>
                                              <a href="/tasks/{{ $item->id }}/edit/"
                                                  class="inline-block text-center py-4 w-20 underline underline-offset-2 text-sky-600 md:hover:bg-sky-100 transition-colors">編集</a>
                                          </div>
                                          <div>
                                              <form action="/tasks/{{ $item->id }}" method="post"
                                                  class="inline-block text-gray-500 font-medium"
                                                  role="menuitem" tabindex="-1">
                                                  @csrf
                                                  @method('DELETE')
                                                  <button type="submit"
                                                      class="py-4 w-20 md:hover:bg-slate-200 transition-colors">削除</button>
                                              </form>
                                          </div>
                                      </div>
                                  </td>
                              </tr>
                          @endforeach
                      </tbody>
                  </table>
              </div>
          </div>
      </div>
  @endif
  {{-- 追記ここまで --}}

ポイントは2つあって、

ひとつは、各formにはそれぞれセキュリティ対策の@csrfを必ず入れること。

もうひとつは、以下のように各ボタン(処理)によってmethod指定がことなること。

  • [完了] :既存のデータと同じデータが渡ってきたときにupdated_atを更新したいから updateメソッドを使いたい。そのためにPUTメソッドを明示的に指定(@method(‘PUT’))する。
  • [削除] :@method(‘DELETE’)を明示的に指定して destroyメソッドを使う。
  • [編集] :formタグではなく、Aタグで”/tasks/{{ $item->id }}/edit/”を指定。チュートリアルブログでは、「これは、リソースコントローラーのeditメソッドを呼び出し、editメソッド内で編集画面のビュー(この後作成します)を返すようにするためです。」とあるが、今は理解できない。
    *Aタグだと、GETメソッドになるのでTaskControllerのeditメソッドが呼ばれるからか??

次回は、編集、完了、削除の処理でフィニッシュ!

コメント

PHP Code Snippets Powered By : XYZScripts.com
タイトルとURLをコピーしました