PHP
laravel5
PHP7
laravel5.5

Laravelのpatch/putでハマった話


トラブル発生

laravelで書かれたAPIの動作検証をpostmanで実行していたのですが、

patchメソッドやputメソッドではリクエストの中身が取得できていない問題が発生しました。


調査

dd($request->all());

を実行すると結果はnull

phpUnitからのテストは通っているので

サーバ側のログを追ってみると

実際のリクエストはpostで飛んできていて

_methodsというパラメータにpatchが指定されていました。


解決

postmanのフォームパラーメータのキーに

_methodを追加

値に patchやputを入れてやると上手く動きました。

axiosはpatchメソッド実行時にペイロードがjsonの場合は問題ないのですが、

ペイロードがFormDataの場合はダメという挙動でしたが

同様にformに_merthodパラメータをappendすることで対応できました。

form.append('_method', 'patch')

await axios.post(apiUrl, form)


おまけ

ちなみに、formをbladeで書く場合は

 {{ method_field('PATCH') }}

または

@method('PATCH')

をformタグの内部に書く必要があるそうです。

csrfトークンと同じですね。