Laravel 5.3 - 向所有视图共享 $user 变量
Laravel 5.3 - Sharing $user variable to all views
所以在发现在 Controller.php 的构造函数中共享视图不再有效,因为它总是 returns null
到 Auth::user()
,我正在寻找一个不同的方法。
我只是在寻找一种方法来将 $user
变量与当前登录的用户一起传递到我的所有视图。
以前在 5.2 及以下版本中有效的方法:
public function __construct()
{
view()->share('signed_in', Auth::check());
view()->share('user', Auth::user());
}
这不再有效。我还能如何共享变量?
我试过:
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->user = Auth::user();
$this->signed_in = Auth::guest();
view()->share('signed_in', $this->signed_in);
view()->share('user', $this->user);
return $next($request);
});
}
但是上面的代码不起作用。它确实在没有 "Undefined Variable $user" 错误的情况下加载了页面,但它只显示了导航栏,没有其他任何内容。出于某种原因,它还会弄乱网站 CSS。
还有其他方法吗?
请帮忙。谢谢。
是的,例如,您可以创建一个新的服务提供商,并在您的 config/app.php
中注册它,然后将共享逻辑放在那里。
让我们从创建新服务提供商开始:
~/path/to/project$ php artisan make:provider ShareWithViewServiceProvider
您应该会看到消息 Provider created successfully.
然后您应该编辑您的 config/app.php
,并添加您刚刚创建的新服务提供商:
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\ShareWithViewServiceProvider::class, // <-- This is the new entry
然后在您的服务提供商的引导方法中创建您的逻辑:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ShareWithViewServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
view()->share([
'user' => auth()->user(),
'signedIn' => auth()->check(),
]);
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
请记住,如果您未登录,auth()->user()
将 return null
。
作为一个较短的解决方案,您可以将共享逻辑放在 app\Providers\AppServiceProvider.php
中,Laravel 默认创建它,并且其中没有任何内容(它供我们使用)。
按照您的方式使用中间件回调是解决此问题的正确方法,但您的分配是错误的。
改用这个:
$this->signed_in = Auth::check();
我很轻松地解决了这个问题。
在我的\App\Http\Controllers\Controller.php
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
private $user;
private $signed_in;
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->user = Auth::user();
$this->signed_in = Auth::check();
view()->share('signed_in', $this->signed_in);
view()->share('user', $this->user);
return $next($request);
});
}
}
通过将 view()->share()
放在中间件的闭包中,我能够实现这一点。
所以在发现在 Controller.php 的构造函数中共享视图不再有效,因为它总是 returns null
到 Auth::user()
,我正在寻找一个不同的方法。
我只是在寻找一种方法来将 $user
变量与当前登录的用户一起传递到我的所有视图。
以前在 5.2 及以下版本中有效的方法:
public function __construct()
{
view()->share('signed_in', Auth::check());
view()->share('user', Auth::user());
}
这不再有效。我还能如何共享变量?
我试过:
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->user = Auth::user();
$this->signed_in = Auth::guest();
view()->share('signed_in', $this->signed_in);
view()->share('user', $this->user);
return $next($request);
});
}
但是上面的代码不起作用。它确实在没有 "Undefined Variable $user" 错误的情况下加载了页面,但它只显示了导航栏,没有其他任何内容。出于某种原因,它还会弄乱网站 CSS。
还有其他方法吗? 请帮忙。谢谢。
是的,例如,您可以创建一个新的服务提供商,并在您的 config/app.php
中注册它,然后将共享逻辑放在那里。
让我们从创建新服务提供商开始:
~/path/to/project$ php artisan make:provider ShareWithViewServiceProvider
您应该会看到消息 Provider created successfully.
然后您应该编辑您的 config/app.php
,并添加您刚刚创建的新服务提供商:
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\ShareWithViewServiceProvider::class, // <-- This is the new entry
然后在您的服务提供商的引导方法中创建您的逻辑:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ShareWithViewServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
view()->share([
'user' => auth()->user(),
'signedIn' => auth()->check(),
]);
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
请记住,如果您未登录,auth()->user()
将 return null
。
作为一个较短的解决方案,您可以将共享逻辑放在 app\Providers\AppServiceProvider.php
中,Laravel 默认创建它,并且其中没有任何内容(它供我们使用)。
按照您的方式使用中间件回调是解决此问题的正确方法,但您的分配是错误的。
改用这个:
$this->signed_in = Auth::check();
我很轻松地解决了这个问题。
在我的\App\Http\Controllers\Controller.php
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
private $user;
private $signed_in;
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->user = Auth::user();
$this->signed_in = Auth::check();
view()->share('signed_in', $this->signed_in);
view()->share('user', $this->user);
return $next($request);
});
}
}
通过将 view()->share()
放在中间件的闭包中,我能够实现这一点。