【问题标题】:Laravel 5.2 - Session flash data not set in service providerLaravel 5.2 - 服务提供商中未设置会话闪存数据
【发布时间】:2017-01-08 09:32:22
【问题描述】:

我为我的应用创建了一个前端服务提供者:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Session;

class FrontendServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        view()->share('message', !is_null(Session::get('message')) ? '<div class="alert alert-success"><strong>Success! </strong>'.Session::get('message').'</div>' : '');
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

我正在控制器中设置一条闪烁消息,如下所示:

public function resend_welcome($token)
{
    $user_id = Crypt::decrypt($token);
    $user = User::findOrFail($user_id);
    if($user->meta->confirmed==1) {
        abort(404);
    }
    Event::fire(new UserRegistered($user));

    Session::flash('message', 'A new email has been sent.');

    return redirect(route('register.success', $token));
}

然后在我看来,我试图像这样输出 $message:

{{ $message }}

问题是 $message 总是 NULL。如果我在我的视图中使用Session::get('message'),那么它会起作用并显示闪存消息。为什么Session::get('message')在服务提供者中总是为NULL,即使我已经在控制器中设置了?

【问题讨论】:

    标签: laravel laravel-5 laravel-5.2


    【解决方案1】:

    在 Laravel 5 中,无法在服务提供者 boot 方法中访问会话信息,因为会话逻辑仅作为 Web 中间件组 Illuminate\Session\Middleware\StartSession::class 的一部分启动。

    要共享视图变量,您可以使用中间件。比如:

    class BroadcastFlashMessage
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request $request
         * @param  \Closure                 $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            view()->share('message', !is_null(Session::get('message')) 
                ? '<div class="alert alert-success"><strong>Success! </strong>'.Session::get('message').'</div>' 
                : '');
    
            return $next($request);
        }
    }
    

    另一种方法是使用laracasts/flash 包。

    【讨论】:

      猜你喜欢
      • 2016-08-23
      • 2016-03-16
      • 1970-01-01
      • 2017-06-09
      • 2016-08-25
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      相关资源
      最近更新 更多