Laravel BladeでPUT, PATCH, DELETEメソッドを使う方法
こんにちは。今回はLaravelのBladeでPUT, PATCH, DELETEなどのHTTPメソッドを使う方法を解説します。処理の種別毎により細かくHTTPメソッドを分けて使いたい場合がありますよね。LaravelのBladeでは一筋縄ではいかなかったので、解決策を共有したいと思います。
結論:@methodディレクディブを使用すると解決できます
まずは具体的な解決策から提示していきます。
素直にformタグのメソッドに PUT, PATCH, DELETE を指定すると以下のようなエラーとなってしまいます。
<form action="/sample/index" method="patch">
<input type="submit" text="提出">
</form>
formのmethod属性にはpatchを指定しているのですが、実際にはgetに変換されて送信されていることが原因です。これを防ぐためには以下の解決策を適用します。
formタグのメソッドはpostにし、formタグ内に@methodディレクティブを使ってmethodを定義します。
<form action="/sample/index" method="post">
@method('patch')
@csrf
<input type="submit" text="提出">
</form>
以上のコードでエラーが起きることなく、通信することができます。
@methodの仕組みを少し解説しましょう。@method('patch’)は実際には以下のHTMLに変換されます。name="_method"というパラメータでサーバー側に渡され、サーバー側は_methodの値を見てルーティングする仕組みです。
<input type="hidden" name="_method" value="patch">
エラーになる理由
エラーになるのはHTMLのformタグはGET, POST以外のメソッドを作ることができない仕様となっているからです。これはHTMLの仕様に無いのでどのブラウザでも作ることができないのがエラーとなる理由です。
まとめ
今回はHTMLでGET POST以外のメソッドを指定する方法について解説しました。HTMLの仕様上、取り扱えるのはGETかPOSTのみなので、hiddenの_methodパラメータでPUT, PATCH, DELETE等は指定する必要があります。
他のフレームワークも大体同じような仕様で実現しているようですね。仕組みを覚えておくと他のフレームワークでも応用が利くと思います。
ディスカッション
コメント一覧
まだ、コメントがありません