Laravelのルーティングは、 routes/web.php
などに記載します。
そこで POST のみとか、 GET のみを受け付けるようにルーティングを記載します。
しかし、たまに POST しているのに、GETになってしまうときがあって、よくわかんなくなることがありますので、確認ポイントをまとめました。
- 「登録する」などのボタンが a タグで記載されている(リンクになっている)
- form タグの指定が
<form method="GET"
となっている - routeのキャッシュが残っている
- POSTはちゃんとしているけど、validationや権限のせいで、リダイレクトさせられている
それぞれの内容を説明します。
1. 「登録する」などのボタンが a タグで記載されている(リンクになっている)
以下のようになっていませんか?
これはサンプルHTML作成したときの名残りとか、きちんと設定しなせばすぐに解決します。
<form action="{{ route('edit_profile') }}">
@csrf
<input type="text" name="name" value="{{ old('name', $name) }}">
~略~
<a href="{{ route('edit_profile') }}" class="btn btn-primary">
登録する
</a>
</form>
解決方法: ボタンを <button>
タグで設定する
2. form タグの指定が <form method="GET"
となっている
本当はPOSTにしたかったのに、なぜかGETでアクセスしている場合、formタグの指定が間違っている可能性があります。 <form medhot="GET"
になっている場合、POST ではなく GET でアクセスされます。
<form action="{{ route('edit_profile') }}" method="GET">
@csrf
<input type="text" name="name" value="{{ old('name', $name) }}">
3. routeのキャッシュが残っている
Laravel で、なんかよくわかんないけどアクセスできないときとか、もう思い切って、キャッシュクリアするといいと思います。
キャッシュクリアしてできなかったら、別の問題だ!と考えればいいです。
4. POSTしていて、validationや権限のせいで、リダイレクトさせられている
ブラウザのデベロッパーツールを使用して、HTTPリクエストの様子をみましょう!
リダイレクトしている場合、HTTPステータス302があって、そのあと200のリクエストが発生していることが多いです。
これは、validationとかでエラーになっているので前の画面に戻されていますが、エラーメッセージの表示枠が無いためになにも表示されないので、よくわからない状況になります。
もし「登録する」などのボタンを押しても反応がない場合は、以下のソースコードを blade に挿入してみてください。
@foreach ($errors->all() as $error)
<li>{{$error}}</li>
@endforeach