【问题标题】:Laravel: How to access session value in AppServiceProvider?Laravel:如何访问 AppServiceProvider 中的会话值?
【发布时间】:2016-05-20 17:39:26
【问题描述】:

有什么方法可以访问AppServiceProvider 中的会话值吗?我想在所有视图中全局共享会话价值。

【问题讨论】:

  • 请检查我的更新答案
  • @Moppo 可以了,谢谢

标签: php laravel session laravel-5 laravel-5.1


【解决方案1】:

您不能直接从服务提供者读取会话:在 Laravel 中,会话由 StartSession 中间件处理,该中间件在所有服务提供者启动阶段之后执行

如果您想与所有视图共享会话变量,您可以使用服务提供商提供的view composer

public function boot()
{
    view()->composer('*', function ($view) 
    {
        $view->with('your_var', \Session::get('var') );    
    });  
}

作为第二个参数传递给 composer 的回调将在视图渲染时被调用,因此 StartSession 将在此时执行

【讨论】:

  • 很好,很好,谢谢
【解决方案2】:

以下在 Laravel 5.2 上适用于我,它是否会导致您的应用出现错误?

AppServiceProvider.php

class AppServiceProvider extends ServiceProvider
{
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    \Session::put('lang', 'en_US');
    view()->share('lang', \Session::get('lang', 'de_DE'));
}

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

home.blade.php

<h1>{{$lang}}</h1>

在浏览器中显示“en_US”。

【讨论】:

  • \session 不工作,得到空结果,例如我试过这个print_r(\Session::all()); 没有结果
  • @Kaloyan:你确定你没有在其他地方设置变量吗?我认为您不能从服务提供商访问会话,因为它是在中间件中启动的
  • @Moppo,是的,我没有在其他任何地方设置它,也许它在 5.1 和 5.2 之间发生了变化?
  • 看来你可以从服务提供者那里写会话,但你不能读它。在您的情况下,它可以在您读取直接在同一请求上设置的值时起作用。但是如果你删除\Session::put('lang', 'en_US'); 行并再次请求,则不会从会话中读取该值
【解决方案3】:

添加新的网络中间件 ShareDataForView

在 \app\Http\Kernel.php 中:

protected $middlewareGroups = [
    'web' => [
        // ...
        \Illuminate\Session\Middleware\StartSession::class,
        // I will always ShareDataForView after StartSession
        \App\Http\Middleware\ShareDataForView::class,
...

并在 app\Http\Middleware\ShareDataForView.php 的方法“handle”中编写代码,例如:

<?php

namespace App\Http\Middleware;

use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Closure;
use Log, Exception, View;

class ShareDataForView
{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        $user  = Auth::user();
        $bank = NULL;
        if ( $user ){
            $bank = $user->bank;
        }
        View::share('user', $user);
        session()->put(['bank' => $bank]);

        return $next($request);
    }
}

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多