Я пытаюсь выполнить связанный с пользователем запрос, чтобы получить данные, которые будут отображаться на верхней панели моего сайта при каждом просмотре.
Я создал новый BaseController в соответствии с первым ответом здесь:
Как передать данные во все представления в Laravel 5?
и это работает для простого теста (просто разделяя типизированную переменную), но когда я пытаюсь использовать Auth::user()->id в методе __construct BaseController (который в других моих контроллерах всегда возвращает идентификатор текущего пользователя, вошедшего в систему), я получаю Trying to get property 'id' of non-object.
Я пробовал добавить use App\User в начало BaseController (хотя обычно это не требуется), а также попытался добавить биты для плагина Spatie laravel-permission, но ни один из них не дал никакого эффекта.
Я попробовал dd на Auth::user() и получил "ноль". Мне кажется, что данные пользователя, возможно, не были загружены на этом этапе, но BaseController расширяет Controller так же, как MyWorkingController расширяет Controller, поэтому я не уверен, почему Auth::user()->id здесь не работает, когда он работает нормально?






Создайте базовый контроллер, который имеет всю информацию, которую вы хотите поделиться, со всеми контроллерами / страницами / представлениями, и позвольте другим вашим контроллерам расширять ее.
Если вы перечитаете мой вопрос, это именно то, что я делаю и что предлагает связанный ответ. Проблема в том, что информация, которой я хочу поделиться, похоже, недоступна для BaseController.
Я только что видел его. Попробуйте сделать это не в __construct и посмотрите, работает ли. __construct загружается раньше всего, и это возможно.
Проблема в том, что мне нужно, чтобы функция запускалась автоматически при каждой загрузке страницы. Возможно ли это, если я вставлю код в какую-нибудь другую функцию, которую создаю?
Я думаю, что где-то я использовал код, такой как Абдулла Аль Шакиб прокомментировал здесь в последнем комментарии.
откройте файл AppServiceProvider.php из папки Providers и напишите ниже код в функции загрузки
view()->composer('*', function ($view)
{
$view->with('cartItem', $cart );
});
А теперь перейдите на страницу просмотра и напишите:
{{ $cartItem }}
$ view-> with ('cartItem', $ cart); в этой строке $ cart будет заменен вашими данными, которыми вы хотите поделиться со всеми вашими представлениями
Это сработало для простой введенной переменной, но я все еще не мог использовать Auth::user()->id для получения текущего идентификатора пользователя. Я добавил use Auth и use DB, чтобы я мог запустить свой запрос, чтобы получить информацию, но затем получил большую ошибку по поводу материала фреймворка Symfony.
ты можешь использовать все, просто проверь мой второй ответ
Вы не можете получить доступ к Auth в конструкторах, потому что middleware еще не запущен. Вы можете использовать либо Посмотреть композитора, либо попробовать этот способ, хотя я не тестировал.
class BaseController extends Controller {
protected $userId;
public function __construct() {
$this->middleware(function ($request, $next) {
$this->userId= Auth::user()->id;
return $next($request);
});
}
}
Предположительно тогда я бы просто использовал $userId вместо Auth::user()->id? Я попытался сделать это, но получил ошибку неопределенной переменной
Напишите это в 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 }}
Кажется, это не работает, но мне пришлось отредактировать его, потому что у меня нет тележки, и, возможно, это сломала моя замена. У вас есть пример без корзины, который есть во всех установках Laravel?
Для всех, кому интересно, я столкнулся с той же проблемой и решил ее с помощью 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 }}
Вы должны использовать Посмотреть композиторов.
auth()->user()не будет доступен в вашем конструкторе, поскольку он пытается получить его из сеанса, который недоступен в конструкторах.