以前、ご相談した内容に関連するのですが、また発生しましたのでご相談させてください。
【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');
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。