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

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

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

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

Laravel 5

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

Q&A

解決済

1回答

2304閲覧

【Laravel】POSTする時に送信元と送信先のURLが違っているとGETで送信されてしまう原因は何がかんがえられますか?

hasshy

総合スコア102

Laravel

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

Laravel 5

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

0グッド

0クリップ

投稿2019/08/17 15:25

編集2019/08/17 17:26

以前、ご相談した内容に関連するのですが、また発生しましたのでご相談させてください。

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

Laravelの認証にデフォルトで実装されている、パスワードを忘れた場合に再設定するためにメールアドレスを入力するフォームについてです。
メールアドレスをフォームに入れて送信したところ、500エラーになりました。

実装当初は動作している事を確認できており、処理自体は変更していないので実装中に何か誤って設定してしまったのかもしれません。
私自身もソースを戻しながら確認をしておりますが、まだエラー原因には至っておりません。

同じような原因を経験された事がある方がいらっしゃればご教示いただけますでしょうか?
もし、情報が足りない場合はご教示ください。

ソース

ルート

認証処理の部分だけ抽出しました。

ルートの構成はmake:authで作られるルート構成のままで使用しておりますが、
マルチログインのサイトですので、コントローラー階層は変えています。

php

1// 管理画面 2Route::group([ 3 'prefix' => 'admin', 4], function(){ 5 6 // 未ログイン 7 Route::group([ 8 'middleware' => 'guest:admin', 9 ], function(){ 10 11 // ログイン処理 12 Route::get('login', 'Admin\Auth\LoginController@showLoginForm') 13 ->name('admin.login'); 14 Route::post('login', 'Admin\Auth\LoginController@login'); 15 16 // パスワードリセット 17 Route::get('password/reset', 'Admin\Auth\ForgotPasswordController@showLinkRequestForm') 18 ->name('admin.password.request'); 19 Route::post('password/email', 'Admin\Auth\ForgotPasswordController@sendResetLinkEmail') 20 ->name('admin.password.email'); 21 Route::get('password/reset/{token}', 'Admin\Auth\ResetPasswordController@showResetForm') 22 ->name('admin.password.reset'); 23 Route::post('password/reset', 'Admin\Auth\ResetPasswordController@reset') 24 ->name('admin.password.update'); 25 26 }); 27}); 28

フォームページのルート

メールアドレスを入力して、POSTするページのルートです。

php

1Route::get('password/reset', 'Admin\Auth\ForgotPasswordController@showLinkRequestForm') 2 ->name('admin.password.request');

処理ページのルート

上記フォームからPOSTを受け取って処理するページのルートです。

php

1Route::post('password/email', 'Admin\Auth\ForgotPasswordController@sendResetLinkEmail') 2 ->name('admin.password.email');

フォームのblade

ルート名admin.password.request に該当するページで、
メールを入力するフォームのページです。

Formの送信先は、ルート名admin.password.emailです。
FormのメソッドもPOSTです。

php

1<!DOCTYPE html> 2<html lang="jp"> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <meta name="description" content=""> 8 <meta name="author" content=""><meta name="csrf-token" content="hPctaZmgzFB02wNfJjtD1eDICeiKSAyqAz1JIcqe"/> 9 <title>タイトル </title> 10 <link href="http://localhost:8080/css/app.css" rel="stylesheet"> 11 <link href="http://localhost:8080/css/admin_style.css" rel="stylesheet"> </head> 12 <body class="hold-transition login-page login"> 13 <p class="card-body"> 14 パスワードをお忘れですか? <br> 15 下記にメールアドレスを入力してパスワードをリセットすると、リセットするためのリンクが送信されます。 16 </p> 17 <form class="user" method="POST" action="http://localhost:8080/admin/password/email"><input type="hidden" name="_token" value="hPctaZmgzFB02wNfJjtD1eDICeiKSAyqAz1JIcqe"> 18 <div class="form-group"> 19 <input class="form-control form-control-user " id="exampleInputEmail" name="email" type="email" aria-describedby="emailHelp" placeholder="メールアドレスを入力してください。"/> </div> 20 <div class="row"> 21 <div class="col-12"> 22 <button class="btn btn-primary btn-block btn-flat" type="submit">パスワード初期化リンクを送信</button> 23 </div> 24 </div> 25 </form> 26 <hr/> 27 <div class="text-center"><a class="small" href="http://localhost:8080/admin/login">ログインページ</a></div> 28 </div> 29</div> </div> 30</body> 31</html>

Exceptions/Handler.php

問題が発生した時に起因した箇所は下記でした。
エラーページを共通化しようとした時に修正したときのものでした。

(プロジェクトディレクトリ)/app/Exceptions/Handler.php

php

1<?php 2 3namespace App\Exceptions; 4 5use Exception; 6use Illuminate\Auth\AuthenticationException; 7use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; 8use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; 9 10class Handler extends ExceptionHandler 11{ 12 private $routeBase; 13 14 /** 15 * A list of the exception types that are not reported. 16 * 17 * @var array 18 */ 19 protected $dontReport = [ 20 // 21 ]; 22 23 /** 24 * A list of the inputs that are never flashed for validation exceptions. 25 * 26 * @var array 27 */ 28 protected $dontFlash = [ 29 'password', 30 'password_confirmation', 31 ]; 32 33 /** 34 * Report or log an exception. 35 * 36 * @param \Exception $exception 37 * @return void 38 */ 39 public function report(Exception $exception) 40 { 41 parent::report($exception); 42 } 43 44 /** 45 * Render an exception into an HTTP response. 46 * 47 * @param \Illuminate\Http\Request $request 48 * @param \Exception $exception 49 * @return \Illuminate\Http\Response 50 */ 51 public function render($request, Exception $exception) 52 { 53 // ルート確認 54 $route = app('router') 55 ->getRoutes() 56 ->match(app('request') 57 ->create($request->getRequestUri())) 58 ->getName(); 59 $route = explode('.', $route); 60 $this->routeBase = count($route) > 0 61 ? $route[0] 62 : null; 63 return parent::render($request, $exception); 64 } 65 66 protected function renderHttpException(HttpExceptionInterface $e) { 67 $statusCode = $e->getStatusCode(); 68 $message = $e->getMessage(); 69 70 $redirectURL = $this->routeBase 71 ? route(\Config("route.auth_home.{$this->routeBase}")) 72 : null; 73 74 return response()->view('errors.common', 75 compact('statusCode', 'message', 'redirectURL'), 76 $statusCode 77 ); 78 } 79 80 81} 82

エラーログの内容

laravelのlog上は下記のエラーが確認できました。
上記のフォームで送信しているのでPOST送信がされているはずなのですが、GETとして扱われてしまいます。

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

全文

php

1[2019-08-17 23:32:51] 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 2Stack trace: 3#0 /var/www/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php(242): Illuminate\Routing\RouteCollection->methodNotAllowed(Array, 'GET') 4#1 /var/www/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php(176): Illuminate\Routing\RouteCollection->getRouteForMethods(Object(Illuminate\Http\Request), Array) 5#2 /var/www/app/Exceptions/Handler.php(57): Illuminate\Routing\RouteCollection->match(Object(Illuminate\Http\Request)) 6#3 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(112): App\Exceptions\Handler->render(Object(Illuminate\Http\Request), Object(Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException)) 7#4 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleE {"exception":"[object] (Symfony\Component\Debug\Exception\FatalErrorException(code: 1): 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 8Stack trace: 9#0 /var/www/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php(242): Illuminate\Routing\RouteCollection->methodNotAllowed(Array, 'GET') 10#1 /var/www/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php(176): Illuminate\Routing\RouteCollection->getRouteForMethods(Object(Illuminate\Http\Request), Array) 11#2 /var/www/app/Exceptions/Handler.php(57): Illuminate\Routing\RouteCollection->match(Object(Illuminate\Http\Request)) 12#3 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(112): App\Exceptions\Handler->render(Object(Illuminate\Http\Request), Object(Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException)) 13#4 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleE at /var/www/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php:256) 14[stacktrace] 15#0 {main} 16"}

原因と思われる場所

Post前のルートが、password/reset
Post送信先のURLがpassword/emailで、POST先のURLが変わっているためエラーになっているのではないかと思います。

根拠となる理由

同じURLを指定してみたところ正常にPOSTされました。
これで解決はできるのですが、デフォルトの設定で動作しないので、根本的な原因を探っています。

Route::get('password/email', 'Admin\Auth\ForgotPasswordController@showLinkRequestForm') ->name('admin.password.request'); Route::post('password/email', 'Admin\Auth\ForgotPasswordController@sendResetLinkEmail') ->name('admin.password.email');

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
httpメソッドが、GET以外の場合はPOSTとして処理をしないといけませんでした。

php

1 switch ($request->method()) { 2 case "GET": 3 $route = app('router') 4 ->getRoutes() 5 ->match(app('request') 6 ->create($request->getRequestUri())) 7 ->getName(); 8 break; 9 case "POST": 10 case "DELETE": 11 case "PUT": 12 $route = app('router') 13 ->getRoutes() 14 ->match(app('request') 15 ->create($request->getRequestUri(), 'POST')) 16 ->getName(); 17 break; 18 }

投稿2019/08/17 18:24

hasshy

総合スコア102

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問