LoginSignup
6
4

More than 5 years have passed since last update.

Laravel5.2でValidationの$errorsが取得できない対応

Last updated at Posted at 2016-04-19

概要

Laravel 5.2でvalidationでエラーになった場合、viewにセットされるはずの$errorsが空っぽでエラーメッセージが拾えないというバグの調査&対応

環境

  • Laravel 5.2
  • PHP 7.0

原因

route.phpとRouteServiceProviderからmiddleware group 「web」が2重に呼び出され
セッションがリスタートされた(と思われる)

詳細

$errorsは、middlewareのShareErrorsFromSessionがセッションに保存してくれるらしい。
ShareErrorsFromSessionは、Middleware Groupの「web」に設定されている

Kernel.php
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],

なので、route.phpにRoute::groupを書いてやればOKだろうということで下記のように記述した

route.php
Route::group(['middleware' => ['web']], function () {
  Route::get('login', 'AuthController@showLoginFrom');
  Route::post('login', 'AuthController@login');
}

validationエラーを起こすFormを送り、{{ var_dump($errors) }}をしてみた結果。

object(Illuminate\Support\ViewErrorBag)[231]
  protected 'bags' => 
    array (size=0)
      empty

エラーメッセージが来ない。

数時間経過後…

公式を見ていると、以下の記載が!

Keep in mind, the web middleware group is automatically applied to your default routes.php file by the RouteServiceProvider.

webグループはRouteServiceProviderで、自動的に適用されるぜ。
覚えておいてな!

試しにRoute::groupの外に出してみる

route.php
//Route::group(['middleware' => ['web']], function () {
//  Route::get('login', 'AuthController@showLoginFrom');
//  Route::post('login', 'AuthController@login');
//}
Route::get('login', 'AuthController@showLoginFrom');
Route::post('login', 'AuthController@login');

キター!!

object(Illuminate\Support\ViewErrorBag)[195]
  protected 'bags' => 
    array (size=1)
      'default' => 
        object(Illuminate\Support\MessageBag)[196]
          protected 'messages' => 
            array (size=3)
              ...
          protected 'format' => string ':message' (length=8)

もうちょっと調査したところ、
MiddlewareのShareErrorsFromSessionを2回呼び出しても問題なく、
StartSessionを2回呼び出した際に今回の現象が発生した。

おそらく、MiddlewareのStartSessionが2回呼ばれていることでセッションが再発行され、
前のセッションが取得できなくなってしまったと思われる。

公式はちゃんと読もう!

6
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4