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

时间:2016-09-18 14:07:46

标签: php laravel laravel-5.3

因此,在发现Controller.php的构造函数中的共享视图不再有效,因为它总是将null返回到Auth::user()之后,我正在寻找一种不同的方法来实现它。 / p>

我只是想找到一种方法,将当前已登录用户的$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。

我还有其他办法吗? 请帮忙。谢谢。

3 个答案:

答案 0 :(得分:3)

我很容易解决这个问题。

在我的\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()置于中间件的封闭中,我能够实现这一目标。

答案 1 :(得分:1)

使用中间件回调的方式是正确的方法,但你的任务是错误的。

请改用:

$this->signed_in = Auth::check();

答案 2 :(得分:0)

是的,例如,您可以创建一个新的服务提供商,并在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()将返回null

作为一个较短的解决方案,您可以将共享逻辑放在app\Providers\AppServiceProvider.php中,Laravel默认创建它,并且其中没有任何内容(我们可以使用它)。