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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

16627閲覧

【Laravel】FormでPostしてもPostとして送信できない

hasshy

総合スコア102

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/08/13 11:11

編集2019/08/13 13:50

FormからPostしたいのですが、Postとして処理できず下記のようなエラーが発生します。

local.ERROR: Uncaught Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException: The GET method is not supported for this route. Supported methods: POST. in /var/www/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php:256

他のページでは特に問題なくPOSTできるのですが、このrouteのページだけエラーが発生しています。
特に特殊な処理はしていないのですが、何か考えられる原因はないでしょうか?

もし、他の部分も載せた方が良い場合はご教示ください。

ソース

view

フォームのタグです。
methodもPOSTなのでPostで処理をされているはずです。

php

1<form method="POST" action="{{ route('csv.import') }}" accept-charset="UTF-8" enctype="multipart/form-data" > 2 @csrf 3 <input class="cutom-file-input" id="csv-input" type="file" name="import_file"/> 4 <div class="btn-group"> 5 <button class="btn btn-primary" type="submit">アップロード</button> 6 </div> 7</form>

route.php

Formのactionに設定しているルートです。
管理画面配下のページなので、MiddlewareにAuthの処理が入っていますが、それ以外は入っていません。

php

1Route::post('/import', 'UserController@csvImport') 2 ->name('csv.import');

UserController

ルートで呼び出すコントローラーと

php

1public function csvImport(UserCsvImportRequest $request){ 2 dd($request); 3}

UserCsvImportRequest

コントローラーで呼び出すRequestの処理は下記です。

php

1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class UserCsvImportRequest extends FormRequest 8{ 9 /** 10 * Determine if the user is authorized to make this request. 11 * 12 * @return bool 13 */ 14 public function authorize() 15 { 16 return true; 17 } 18 19 public function attributes() 20 { 21 return [ 22 'import_file' => 'インポートするファイル' 23 ]; 24 } 25 26 /** 27 * Get the validation rules that apply to the request. 28 * 29 * @return array 30 */ 31 public function rules() 32 { 33 return [ 34 'import_file' => [ 35 'required', 36 'max:5', 37 'file', 38 'mimes:csv' 39 ] 40 ]; 41 } 42} 43

試した事

メソッドを変える

試しに、メソッドをgetに変えてみました。

php

1Route::get('/import', 'School\UserController@csvImport') 2 ->name('csv.import');

変更してGetでアクセスすると、下記のエラーが吐かれており、POSTでもGETでも、HEADでもない状態なのがわかりました。

405 The POST method is not supported for this route. Supported methods: GET, HEAD.

GET,POSTを指定する

両方のメソッドを指定すると、Postが実行できることを確認できました。

php

1Route::match(['get', 'post'], '/import', 'School\UserController@csvImport') 2 ->name('csv.import');

Requestをデフォルトに変える

自作したRequestクラスに変えたところ、post出来ました。

php

1public function csvImport(Request $request){ 2 dd($request); 3}

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

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

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

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

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

m.ts10806

2019/08/13 11:58

enctype="multipart/form-data"  が指定されていないのでいずれにしてもファイル送信はされないと思いますが、そこは関係なさそうですか?
hasshy

2019/08/13 13:19

ご指摘ありがとうございます。 本件に関係なく指定が必要でしたね…。 enctype="multipart/form-data"を指定してみましたが、変わりませんでした。 質問にも追記します。
hasshy

2019/08/13 13:43

度々ありがとうございます。 matchで両メソッドを有効にしたところエラーではなく、バリデーション後にリダイレクトする挙動で戻ってきたのでエラーは解決できました。 後ほど追記しましすが、呼び出す関数で指定する引数のRequestも関係していました。 自分で作成(make:request)で作ったものではなく、デフォルトRequestにするとpostの挙動が出来る事がわかりました。 authorizeの戻り値はtrueにしています。
guest

回答1

0

自己解決

状況が改善したので一旦クローズさせていただきます。
試した事は下記です。

  • 自作のRequestのauthorizeをtrueにする
  • routeのキャッシュをクリアする
  • Route:matchで一度GETとPOSTを指定してみる(キャッシュに関係する?)
  • formにenctype="multipart/form-data"を付与する

投稿2019/08/13 14:00

hasshy

総合スコア102

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

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

EbiTT

2021/06/21 05:44

私も同様な問題に遭遇しました。 > formにenctype="multipart/form-data"を付与する こちらでのみで解決しましたのでご報告します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問