Laravelでブレードにフォームを作成し、いざ送信ボタンを押したら、
419 Page Expired と出ませんでしたか?
原因は
- フォームに @csrf を入れ忘れている
- 画像送信フォームにenctype="multipart/form-data"が入ってない
- requestのauthorizeがfalseになっている
- キャッシュが邪魔をしている
のどれかの可能性が高いです。
419 Page Expiredの原因1:@csrfを入れ忘れている
Laravel(5.6以降、6、7、8など)では、フォームをブレード上に作成した場合、必ず、
この画像のように、<form>~</form>の間に@csrfと記述する必要があります。
もし、Laravel5.5かそれ以前の場合は、
{{ csrf_field() }}
と代わりに書く必要があります。
これは、Cross Site Request Forgery(クロスサイトリクエストフォージェリ)という不正なフォーム送信(なりすまし送信、ハッキング)を防ぐためのタグです。
これを付け忘れてると、419 Page Expired になります。
419 Page Expiredの原因2:ファイル送信フォームにenctype="multipart/form-data"が入ってない
もしくは、もしあなたのフォームに画像や音声などのファイルをアップロードするボタンが付いてる場合は、<form>にenctype="multipart/form-data"という記述がないと、419 Page Expiredと出てアップロードできないようになってます。
図のように、<form>タグ内に、enctype="multipart/form-data"と足す事で、419 Page Expiredと出ずにファイルアップロードができるようになるはずです。
419 Page Expiredの原因3:Requestのauthorizeがfalseになっている
さらにもしあなたが、バリデーションを使ってる場合は、バリデーションが書かれているRequest.phpが原因かもしれません。
例えば、下図のように、コントローラーにContactRequestというバリデーションファイルを使ってる場合は、
app\Http\RequestsフォルダのContactRequest.phpを開きます。
開くと、public funciton authorize()というメソッドがあり、
もしそこがreturn falseになってる場合は、419 Page Expiredに必ずなります。
なぜなら、falseという事はフォーム自体が送れないようになってるからです。
なので、return false; を return true; に書き換えて、上書き保存する事で、419 Page Expiredが出なくなるはずです。
バリデーションについてはこの記事で詳しく解説してるよ↓
Laravel6チュートリアル:バリデーション(入力禁止文字)をフォームに実装しよう!
419 Page Expiredの原因4:キャッシュが邪魔をしている
まず、文字や@が日本語入力の全角英語になってしまってないかチェックして。
もしくは、キャッシュが残ってしまってる可能性があるから、
そんな時はコマンドプロンプト(Shell/ターミナル)を開いて、
cdでLaravelプロジェクトフォルダに移動した後、
php artisan config:cacheと入力、Enterして、
ブラウザをCtrl + F5で更新して試してみて。
それでダメなら、
php artisan route:clear
php artisan view:clear
composer dump-autoload -o
などを同じように試してみるのもあり。
そして、ブラウザをctrl+F5で更新すると直ったりするよ。