Laravel与所有视图共享数据

时间:2019-01-10 12:28:37

标签: laravel laravel-5 controller

我正在尝试运行与用户相关的查询,以获取要显示在每个视图的网站顶部栏中的数据。

我根据这里的第一个答案创建了一个新的BaseController:

How to pass data to all views in Laravel 5?

,这适用于一个简单的测试(只是共享一个输入变量),但是当我尝试在BaseController的Auth::user()->id方法中使用__construct时(在我的其他控制器中,该方法总是返回当前登录用户的ID),我得到Trying to get property 'id' of non-object

我尝试在BaseController的顶部添加use App\User(尽管通常不需要),还尝试为Spatie laravel-permission插件添加位,但都没有效果。

我在Auth::user()上尝试了dd,只是得到'null'。我的感觉是在此阶段可能尚未加载用户详细信息,但是BaseController扩展了Controller,而MyWorkingController扩展了Controller,所以我不确定为什么Auth::user()->id在正常运行时在这里不起作用?

5 个答案:

答案 0 :(得分:0)

创建一个基本控制器,其中包含您想要共享所有控制器/页面/视图的所有信息,并让您的其他控制器对其进行扩展。

答案 1 :(得分:0)

从文件夹Providers中打开文件AppServiceProvider.php,并在启动功能中编写以下代码

     view()->composer('*', function ($view)
    {
        $view->with('cartItem', $cart );

    });

现在转到您的查看页面并输入:

{{ $cartItem }}

答案 2 :(得分:0)

您无法在构造函数中访问Auth,因为尚未运行middleware。您可以使用View composer或尝试这种方式,尽管我尚未进行测试。

class BaseController extends Controller {
    protected $userId;

    public function __construct() {
        $this->middleware(function ($request, $next) {
           $this->userId= Auth::user()->id;

           return $next($request);
        });
    }
}

答案 3 :(得分:0)

在AppServiceProvider.php中将其写入

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use DB;
use Auth;
use App\Cart;

class AppServiceProvider extends ServiceProvider
{

    public function boot()
    {
        Schema::defaultStringLength(191);

            view()->composer('*', function ($view)
            {

                view()->composer('*', function($view)
                {
                    if (Auth::check()) {
                        $cart = Cart::where('user_id', Auth::user()->user_id)->count();
                        $view->with('cartItem', $cart );
                    }else {
                        $view->with('cartItem', 0);
                    }
                });


            });

    }


}

在您看来,只需写

{{ $cartItem }}

答案 4 :(得分:0)

对于任何感兴趣的人,我刚刚遇到了同样的问题,我已经用 ServiceProvider 解决了它:

  1. 使用命令定义您的自定义 ServiceProvider
php artisan make:provider CustomServiceProvider
  1. config\app.php 文件中添加对您的服务提供商的引用,特别是在 providers 数组中,向其中添加此项:
\App\Providers\CustomServiceProvider::class,
  1. 在提供程序的 boot() 方法中声明要共享的变量,并使用 view()->share 方法共享它们:
public function boot()
{
    $shared_variable = "Hello";

    view()->share('shared_variable', $shared_variable); 
}
  1. 您现在可以使用标准符号在刀片文件中引用您的变量:
{{ $shared_variable }}