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等は指定する必要があります。

他のフレームワークも大体同じような仕様で実現しているようですね。仕組みを覚えておくと他のフレームワークでも応用が利くと思います。

Laravel

Posted by kobainmac