質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

2回答

3078閲覧

Laravelを使用したVueのcomponent内のformのpostリクエストで419エラー

SanQ

総合スコア92

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2020/06/02 11:23

#開発環境

ツールバージョン
Laravel7.12.0
nodev8.10.0
npm3.5.2

#困っていること
現在LaravelのbladeテンプレートにVueRouterとcomponentを使用し、シングルページアプリケーションを作成しています。そのアプリケーション内のVueRouterに指定されたContribute.vueというcomponentの中にはhtmlのformタグがあり、postリクエストを受けてバックエンドのメソッドが実行される仕組みになっています。実際にこのcomponentを実行したところ、419エラーが出てしまったので、bladeテンプレートでやっていることと同じようにformタグ内へ@csrfを行ったところ、そのcomponent内では無効になってしまい、せっかくcsrfトークンを発行してもformタグへの受け渡しがうまくいきません。
どうしたらそのcomponent内のformタグ内へ発行したcsrfトークンを受け渡すことができるのでしょうか?

#ブラウザのデベロッパーツールのElements

ブラウザのデベロッパーツールのElements

画像のように<input type="hidden" name="_token" value=略>でトークンを発行しているのですが、そのトークンが送信する対象の<form action="/contribute" method="post" enctype="multipart/form-data">...</form>内にないのでpostメソッドが送られても419エラーが出てしまいます。

#実際のコード
Viewのコード

html

1<html> 2<head> 3<meta name="csrf-token" content="{{ csrf_token() }}"> 4</head> 5<body> 6<div id="adminerApp"> 7<h1>Success!</h1> 8 9<nav> 10@csrf 11<router-link to="/contribute">投稿フォームへ</router-link> 12<router-link to="/controll-users">ユーザー管理ページへ</router-link> 13</nav> 14<router-view></router-view> 15 16</div> 17<script src="{{ asset('/js/app.js') }}"></script> 18</body> 19</html>

/resources/js/app.js

js

1import './bootstrap' import Vue from 'vue'; 2import VueRouter from 'vue-router'; 3import Contribute from './components/Contribute.vue'; 4 5 6window.Vue = Vue; 7Vue.use(VueRouter); 8 9const adminerRouter = new VueRouter({ 10 routes: [ 11 { 12 path: '/contribute', 13 component: Contribute 14 }, 15 { 16 path: '/controll-users', 17 component: ControllUsers 18 }, 19 ] 20}); 21 22const appAdminer = new Vue({ 23  el: '#adminerApp', 24  router:adminerRouter 25 })

Contribute.vue

vue

1<template> 2<div> 3<h1>投稿フォーム</h1> 4<form action="/contribute" method="post" enctype="multipart/form-data"> 5<p>タイトル</p> 6<input type="text" name="title"> 7<p>内容</p> 8<textarea name="contents" rows="5" cols="50"></textarea> 9<p>画像</p> 10<input type="file" name="picture"> 11<p>ジャンル</p> 12<select name="genre"> 13<option value="アニメ">アニメ</option> 14<option value="アクション">アクション</option> 15<option value="アドベンチャー">アドベンチャー</option> 16<option value="SF">SF</option> 17<option value="コメディ">コメディ</option> 18<option value="サスペンス">サスペンス</option> 19<option value="青春">青春</option> 20<option value="戦争">戦争</option> 21<option value="ドキュメンタリー">ドキュメンタリー</option> 22<option value="ドラマ">ドラマ</option> 23<option value="ファンタジー">ファンタジー</option> 24<option value="ホラー">ホラー</option> 25<option value="ミュージカル・音楽">ミュージカル・音楽</option> 26<option value="恋愛">恋愛</option> 27</select> 28<input type="submit" value="投稿"> 29</form> 30</div> 31</template> 32 33<script></script>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

<html> <head> <meta name="csrf-token" content="{{ csrf_token() }}"> </head> <body> <div id="adminerApp"> <h1>Success!</h1> <nav> @csrf <router-link to="/contribute">投稿フォームへ</router-link> <router-link to="/controll-users">ユーザー管理ページへ</router-link> </nav> <router-view></router-view> </div> <script src="{{ asset('/js/app.js') }}"></script> <script> $('body').on('submit', 'form', function () { $(this).append('@csrf') }) </script> </body> </html>

こんな感じで送信時に無理やりCSRFトークンを差し込むか
全体的にAjaxに切り替えた方が良いかと

投稿2020/06/08 04:32

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SanQ

2020/06/08 09:14

このコードの通りに書くと正常に作動しました! ありがとうございます。
guest

0

投稿2020/06/02 14:05

kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SanQ

2020/06/07 14:34

返信が大変遅くなり申し訳ありません。 今回教えていただいた記事や、「Laravelでajaxに挑戦してみた」(https://qiita.com/misskabu/items/735e6be68d4ef5f34d32)を参考にViewのコードに以下のようなコードを追加してもう一度試してみました。 <script> $(function() { $('#submit').click(function() { $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); $.ajax({ type: 'POST', url: '/contribute', }).fail(function() { console.log('error'); }); }); } ) </script> このコードで試してみても419エラーのままでした。 申し訳ないのですが、csrfトークンの受け渡しの方法についてもう少し詳しく教えてもらえないでしょうか?
SanQ

2020/06/07 15:19

自分のコードのどのあたりが頓珍漢だったか教えてもらってもよろしいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問