【问题标题】:Laravel 5.2 Flash Data Does Not PersistLaravel 5.2 Flash 数据不持久
【发布时间】:2016-07-16 09:48:57
【问题描述】:

如果涉及到身份验证中间件,是否应该使用闪存数据进行重定向?

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

    1. 我正在调用 Web 中间件。
    1. 我正在使用文件会话驱动程序。
    1. 我可以检索存储在会话中的值,但闪存数据除外。
    1. 我已尝试通过在 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)

我发现了我认为是根本原因的原因,如下所示。每条路线都调用了两次“网络”中间件。因此,实际上发生了两个请求,即在用户有机会看到它们之前将其删除。原路线:列表如下。

+--------+----------+-------------------------+------+-----------------------------------------------------------------+---------------+
| 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  |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+---------------+

从“网络”中间件中删除路由后,我的路由现在如下所示:

+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
| 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   |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+

将路由移出“网络”中间件组后,闪烁消息会正确显示。 但是,现在我有一个新问题!

在初始请求后,闪存消息不会从会话中删除。它们保留每个后续请求,直到它们被手动刷新或忘记。

此时我不确定是否应该提出第二个问题,专门解决闪存数据的持久性问题。如果有请告知。

【问题讨论】:

  • 介意显示 issue artisan command php artisan route:list 的输出?
  • @terrylow 我根据您的要求添加了路线:列表。我做了一些额外的发现,并将继续深入研究这个问题。感谢所有帮助!
  • 请恢复您的路由并执行composer update,在 laravel/framwork 5.2.27 的发布中已经解决了双 web 中间件身份验证路由错误,然后运行php artisan make:auth btw 删除你有手动刷新会话的行,你的问题应该不会再出现了
  • @terrylow 我更新到 5.2.27。我的路由仍然显示 Web 中间件在我的路由上应用了两次。与 Route::auth() 关联的路由是正确的。为了删除重复的“网络”,我不得不将其余路由移出“网络”中间件。 flash 消息再次出现,但它们在后续请求中仍然存在,包括与 auth $errors 关联的请求。
  • 这很奇怪,所以如果您的路由不在网络中间件中,那么 Flash 消息是否可以正常工作?你删除了$request->session()->reflash(); 行吗?

标签: php laravel laravel-5.2 flash-message


【解决方案1】:

请运行 composer update 将 laravel/framework 更新到 v5.2.27,然后发出 php artisan make:auth 以重新生成身份验证路由

【讨论】:

    猜你喜欢
    • 2016-11-15
    • 2016-05-07
    • 2016-04-04
    • 1970-01-01
    • 2016-05-12
    • 2016-08-23
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多