我正在尝试运行与用户相关的查询,以获取要显示在每个视图的网站顶部栏中的数据。
我根据这里的第一个答案创建了一个新的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
在正常运行时在这里不起作用?>
答案 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
解决了它:
ServiceProvider
php artisan make:provider CustomServiceProvider
config\app.php
文件中添加对您的服务提供商的引用,特别是在 providers
数组中,向其中添加此项:\App\Providers\CustomServiceProvider::class,
boot()
方法中声明要共享的变量,并使用 view()->share
方法共享它们:public function boot()
{
$shared_variable = "Hello";
view()->share('shared_variable', $shared_variable);
}
{{ $shared_variable }}