Laravel:如何在 AppServiceProvider 中访问会话值


Laravel: How to access session value in AppServiceProvider?

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

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

如果要与所有视图共享会话变量,可以使用服务提供商提供的视图编辑器:

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

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

添加新的 Web 中间件 ShareDataForView

in ''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的方法"句柄"中编写代码,例如:

<?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);
    }
}

以下内容适用于我的 Laravel 5.2,它会导致您的应用程序出错吗?

应用服务提供商.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()
{
    //
}
}

首页.刀锋.php

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

在浏览器中显示"en_US"。