Laravel 5.2 闪存数据不持久化

Laravel 5.2 Flash Data Does Not Persist

如果涉及 auth 中间件,带有 flash 数据的重定向是否应该保留 flash 数据?

一些需要注意的内务管理事项将回答一些可能的后续问题:

因此,Authenticate.php 现在显示如下:

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->guest()) {
        if ($request->ajax() || $request->wantsJson()) {
            return response('Unauthorized.', 401);
        } else {
            return redirect()->guest('login');
        }
    }

    $request->session()->reflash();

    return $next($request);
}

这个问题也影响了 make:auth 生成的 auth 样板,导致 $errors 在出错时无法显示。

更新(3/29 @ 08:54 EST)

我发现了我认为是根本原因的问题,如下所示。每条路由调用 'web' 中间件两次。因此,实际上发生了两个请求,即在用户有机会看到它们之前删除 flash 消息。原文route:list如下

+--------+----------+-------------------------+------+-----------------------------------------------------------------+---------------+
| Domain | Method   | URI                     | Name | Action                                                          | Middleware    |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+---------------+
|        | GET|HEAD | /                       |      | Closure                                                         | web           |
|        | GET|HEAD | groups                  |      | App\Http\Controllers\GroupsController@index                     | web,web,auth  |
|        | GET|HEAD | groups/set-default/{id} |      | App\Http\Controllers\GroupsController@setDefaultGroup           | web,web,auth  |
|        | GET|HEAD | home                    |      | App\Http\Controllers\HomeController@index                       | web,web,auth  |
|        | GET|HEAD | login                   |      | App\Http\Controllers\Auth\AuthController@showLoginForm          | web,web,guest |
|        | POST     | login                   |      | App\Http\Controllers\Auth\AuthController@login                  | web,web,guest |
|        | GET|HEAD | logout                  |      | App\Http\Controllers\Auth\AuthController@logout                 | web,web       |
|        | POST     | password/email          |      | App\Http\Controllers\Auth\PasswordController@sendResetLinkEmail | web,web,guest |
|        | POST     | password/reset          |      | App\Http\Controllers\Auth\PasswordController@reset              | web,web,guest |
|        | GET|HEAD | password/reset/{token?} |      | App\Http\Controllers\Auth\PasswordController@showResetForm      | web,web,guest |
|        | GET|HEAD | register                |      | App\Http\Controllers\Auth\AuthController@showRegistrationForm   | web,web,guest |
|        | POST     | register                |      | App\Http\Controllers\Auth\AuthController@register               | web,web,guest |
|        | GET|HEAD | visitees                |      | App\Http\Controllers\VisiteesController@index                   | web,web,auth  |
|        | GET|HEAD | visitees/check-in/{id}  |      | App\Http\Controllers\VisiteesController@checkIn                 | web,web,auth  |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+---------------+

从 'web' 中间件中删除路由后,我的路由现在显示如下:

+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
| Domain | Method   | URI                     | Name | Action                                                          | Middleware |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
|        | GET|HEAD | /                       |      | Closure                                                         | web        |
|        | GET|HEAD | groups                  |      | App\Http\Controllers\GroupsController@index                     | web,auth   |
|        | GET|HEAD | groups/set-default/{id} |      | App\Http\Controllers\GroupsController@setDefaultGroup           | web,auth   |
|        | GET|HEAD | home                    |      | App\Http\Controllers\HomeController@index                       | web,auth   |
|        | GET|HEAD | login                   |      | App\Http\Controllers\Auth\AuthController@showLoginForm          | web,guest  |
|        | POST     | login                   |      | App\Http\Controllers\Auth\AuthController@login                  | web,guest  |
|        | GET|HEAD | logout                  |      | App\Http\Controllers\Auth\AuthController@logout                 | web        |
|        | POST     | password/email          |      | App\Http\Controllers\Auth\PasswordController@sendResetLinkEmail | web,guest  |
|        | POST     | password/reset          |      | App\Http\Controllers\Auth\PasswordController@reset              | web,guest  |
|        | GET|HEAD | password/reset/{token?} |      | App\Http\Controllers\Auth\PasswordController@showResetForm      | web,guest  |
|        | GET|HEAD | register                |      | App\Http\Controllers\Auth\AuthController@showRegistrationForm   | web,guest  |
|        | POST     | register                |      | App\Http\Controllers\Auth\AuthController@register               | web,guest  |
|        | GET|HEAD | visitees                |      | App\Http\Controllers\VisiteesController@index                   | web,auth   |
|        | GET|HEAD | visitees/check-in/{id}  |      | App\Http\Controllers\VisiteesController@checkIn                 | web,auth   |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+

将路由移出 'web' 中间件组后,闪现消息正确显示。 但是,现在我有一个新问题!

初始请求后,不会从会话中删除即显消息。他们坚持每个后续请求,直到他们被手动刷新或忘记。

我现在不确定是否应该提出第二个问题来专门解决闪存数据的持久化问题。如有请指教

请运行一个composer update更新laravel/framework到v5.2.27,然后发出php artisan make:auth重新生成授权路由