LaravelのRoute::resourceで少しはまった話
はじめに
Laravelでルーティングを行う際に、
Route::resource
と
make:controller controllerName --resource
を使用した時に、update処理で少しはまったこと。
環境
Laravel 5.5
updateではまった
まず–resourceを指定してCRUD対応したコントローラを一度に作る。
Route::resource('charas', 'CharasController');
$ php artisan make:controller CharaController --resource
以下の表に対応したコントローラとルーティングが完成。
メソッド | URI | アクション | ルート名 |
---|---|---|---|
GET | /charas |
index | charas.index |
GET | /charas/create |
create | charas.create |
POST | /charas |
store | charas.store |
GET | /charas/{chara} |
show | charas.show |
GET | /charas/{chara}/edit |
edit | charas.edit |
PUT/PATCH | /charas/{chara} |
update | charas.update |
DELETE | /charas/{chara} |
destroy | charas.destroy |
createとかは特に問題なく。
っで、アップデートだけはまった。
なぜはまったかというと、formタグのmethodをよくわかっていなかったから。
そもそも、formタグで指定できるmethodはGETとPOSTのみ。
でも、上記表にあるようにアップデートするためにはPUT或いはPATCHのHTTPメソッドを使う必要がある。
うまくいかなかったコードは以下
@extends('layouts.base') @section('content') <div class="container"> <div class="col-sm-offset-2 col-sm-8"> <div class="panel panel-default"> <div class="panel-heading"> キャラクターを編集 </div> <div class="panel-body"> <!-- Display Validation Errors --> @include('common.errors') <!-- New Characters Form --> <form action="/trncharacters/{{$form->characterid}}" method="PUT" class="form-horizontal"> {{ csrf_field() }} <input type="hidden" name="characterid" value="{{$form->characterid}}"> <input type="hidden" name="clientid" value="{{$form->clientid}}"> <!-- trnCharacter Name --> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">キャラクタ名</label> <div class="col-sm-6"> <input type="text" name="name" id="book-name" class="form-control" value="{{ $form->name }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">身長</label> <div class="col-sm-6"> <input type="number" name="height" id="height" class="form-control" value="{{ $form->height }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">体重</label> <div class="col-sm-6"> <input type="number" name="weight" id="weight" class="form-control" value="{{ $form->weight }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">出身地</label> <div class="col-sm-6"> <input type="text" name="bornIn" id="bornIn" class="form-control" value="{{ $form->bornIn }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">性格</label> <div class="col-sm-6"> <input type="text" name="personality" id="personality" class="form-control" value="{{ $form->personality }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">経験値取得倍率</label> <div class="col-sm-6"> <input type="text" name="expRatio" id="expRatio" class="form-control" value="{{ $form->expRatio }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">スキル取得倍率</label> <div class="col-sm-6"> <input type="text" name="skillRatio" id="skillRatio" class="form-control" value="{{ $form->skillRatio }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">魔法取得倍率</label> <div class="col-sm-6"> <input type="text" name="magicRatio" id="magicRatio" class="form-control" value="{{ $form->magicRatio }}"> </div> </div> <!-- Add Book Button --> <div class="form-group"> <div class="col-sm-offset-3 col-sm-6"> <button type="submit" class="btn btn-default"> <i class="fa fa-plus"></i>更新 </button> </div> </div> </form> </div> </div> </div> </div> @endsection
ここでダメだったのは、formタグのメソッドに直接PUTを入れたところ。
じゃあどうやってPUT指定するの?
答えは、
1.formタグにはPOSTを指定
2.
{{ method_field('put') }}
を追加する。
以下がうまくいったコード。
@extends('layouts.base') @section('content') <div class="container"> <div class="col-sm-offset-2 col-sm-8"> <div class="panel panel-default"> <div class="panel-heading"> キャラクターを編集 </div> <div class="panel-body"> <!-- Display Validation Errors --> @include('common.errors') <!-- New Characters Form --> <form action="/trncharacters/{{$form->characterid}}" method="POST" class="form-horizontal"> {{ csrf_field() }} {{ method_field('put') }} <input type="hidden" name="characterid" value="{{$form->characterid}}"> <input type="hidden" name="clientid" value="{{$form->clientid}}"> <!-- trnCharacter Name --> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">キャラクタ名</label> <div class="col-sm-6"> <input type="text" name="name" id="book-name" class="form-control" value="{{ $form->name }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">身長</label> <div class="col-sm-6"> <input type="number" name="height" id="height" class="form-control" value="{{ $form->height }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">体重</label> <div class="col-sm-6"> <input type="number" name="weight" id="weight" class="form-control" value="{{ $form->weight }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">出身地</label> <div class="col-sm-6"> <input type="text" name="bornIn" id="bornIn" class="form-control" value="{{ $form->bornIn }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">性格</label> <div class="col-sm-6"> <input type="text" name="personality" id="personality" class="form-control" value="{{ $form->personality }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">経験値取得倍率</label> <div class="col-sm-6"> <input type="text" name="expRatio" id="expRatio" class="form-control" value="{{ $form->expRatio }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">スキル取得倍率</label> <div class="col-sm-6"> <input type="text" name="skillRatio" id="skillRatio" class="form-control" value="{{ $form->skillRatio }}"> </div> </div> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">魔法取得倍率</label> <div class="col-sm-6"> <input type="text" name="magicRatio" id="magicRatio" class="form-control" value="{{ $form->magicRatio }}"> </div> </div> <!-- Add Book Button --> <div class="form-group"> <div class="col-sm-offset-3 col-sm-6"> <button type="submit" class="btn btn-default"> <i class="fa fa-plus"></i>更新 </button> </div> </div> </form> </div> </div> </div> </div> @endsection
まとめ
・formタグで使えるのはGETとPOSTのみ
・他のHTTPメソッドを使うときは以下を追加する
{{ method_field('対象のメソッド') }}
今回は一度にCRUDを作成する–resourceを使った方法についての話。
仮に違う方法、例えば自分でルーティング設定してメソッド名も自分で使ている場合はわざわざHTTPメソッドを変える必要はない。
あと使わないメソッドとかを消したくなるけど、別途設定したりしないといけなかったりするので注意が必要。
それについては、こちらで解説してあった。
マスターのメンテ画面とかならCRUD全部使いそうなので、要は使いどころって感じだな。
ディスカッション
コメント一覧
まだ、コメントがありません