Laravel 5.2 闪存数据不持久化
Laravel 5.2 Flash Data Does Not Persist
如果涉及 auth 中间件,带有 flash 数据的重定向是否应该保留 flash 数据?
一些需要注意的内务管理事项将回答一些可能的后续问题:
- 我调用的是web中间件。
- 我正在使用文件会话驱动程序。
- 我可以检索存储在会话中的值,闪存数据除外。
- 我尝试通过将以下行添加到 Authenticate 中间件来重新刷新闪存数据:
$request->session()->reflash();
因此,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
重新生成授权路由
如果涉及 auth 中间件,带有 flash 数据的重定向是否应该保留 flash 数据?
一些需要注意的内务管理事项将回答一些可能的后续问题:
- 我调用的是web中间件。
- 我正在使用文件会话驱动程序。
- 我可以检索存储在会话中的值,闪存数据除外。
- 我尝试通过将以下行添加到 Authenticate 中间件来重新刷新闪存数据:
$request->session()->reflash();
- 我尝试通过将以下行添加到 Authenticate 中间件来重新刷新闪存数据:
因此,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
重新生成授权路由