【发布时间】:2016-05-20 17:39:26
【问题描述】:
有什么方法可以访问AppServiceProvider 中的会话值吗?我想在所有视图中全局共享会话价值。
【问题讨论】:
-
请检查我的更新答案
-
@Moppo 可以了,谢谢
标签: php laravel session laravel-5 laravel-5.1
有什么方法可以访问AppServiceProvider 中的会话值吗?我想在所有视图中全局共享会话价值。
【问题讨论】:
标签: php laravel session laravel-5 laravel-5.1
您不能直接从服务提供者读取会话:在 Laravel 中,会话由 StartSession 中间件处理,该中间件在所有服务提供者启动阶段之后执行
如果您想与所有视图共享会话变量,您可以使用服务提供商提供的view composer:
public function boot()
{
view()->composer('*', function ($view)
{
$view->with('your_var', \Session::get('var') );
});
}
作为第二个参数传递给 composer 的回调将在视图渲染时被调用,因此 StartSession 将在此时执行
【讨论】:
以下在 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”。
【讨论】:
print_r(\Session::all()); 没有结果
\Session::put('lang', 'en_US'); 行并再次请求,则不会从会话中读取该值
添加新的网络中间件 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);
}
}
【讨论】: