Laravel 5.3 - 向所有视图共享 $user 变量

Laravel 5.3 - Sharing $user variable to all views

所以在发现在 Controller.php 的构造函数中共享视图不再有效,因为它总是 returns nullAuth::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() 放在中间件的闭包中,我能够实现这一点。