Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Всем доброго времени суток
Неожиданно увидел, что на одной из страниц Auth::user() возвращает мне не текущего пользователя, а последнего в таблице Users
В странице нет ничего - простая выгрузка контента.
Функция Контроллера также никак не влияет на фасад Auth.
В ViewComposer заведена $user = Auth::user(); для использования в видах.... в общем ничего необычного. И тут на тебе - левый юзер вылезает...
У кого какие мысли где капать?
Не в сети
[offtopic]В РСУБД нет понятия "первый" или "последний", т.к. таблицы считаются неупорядоченными множествами. Другими словами, в разных запросах у тебя последними будут разные пользователи [/offtopic]
Покажи пожалуйста конкретный кусок кода
1. про view composer и
2. из того места где ты обнаруживаешь не того пользователя.
подозреваю, что где-то ты начинаешь использовать не ту переменную.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
<?php namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use App\Repositories\UserRepository as UserRepository;
class ProfileComposer {
protected $users;
public function __construct(UserRepository $users)
{
// Зависимости разрешаются автоматически службой контейнера...
$this->users = $users;
}
public function compose(View $view)
{
...
$view->with('user', $this->users->getUser());
...
}
}
<?php
namespace App\Repositories;
use App\User;
use App\Profile;
use App\Contract;
use App\Good;
use App\Abonement;
use Auth;
class UserRepository {
protected $user;
...
function __construct() {
$this->user = Auth::user();
...
}
...
public function getUser(){
return $this->user;
}
...
}
...
<h4>{{ $user->profile->declarer_name }}</h4>
<!-- возвращает $user c последним ID -->
...
Не в сети
Я бы для проверки изменил $view->with('user' на $view->with('currentUser' и соответственно <h4>{{ $currentUser->profile->declarer_name }}</h4>
Цель — исключить случайное пересечение с другим $user.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
С версии 5.3, по умолчанию, у вас нет доступа к сессиям в конструкторе.
Есть два пути решения проблемы:
1. https://laravel.com/docs/5.3/upgrade#5. … nstructors
2. https://stackoverflow.com/questions/415 … onstructor
Не в сети
@FrDR, не просто в конструкторе, а в конструкторе контроллера!
Но замечание хорошее.
Изменено artoodetoo (16.04.2018 05:43:54)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Можно применить ленивую инициализацию чтобы не создавать UserRepository::$user слишком рано.
class UserRepository {
protected $user;
function __construct() {
// может сработать слишком рано, когда сессия не доступна
// $this->user = Auth::user();
}
public function getUser(){
if (! isset($this->user)) {
$this->user = Auth::user();
}
return $this->user;
}
...
}
В любом случае, getUser() не мог вернуть "последнего пользователя". Скорее там окажется null. Я считаю что причина ошибки топикстартера в перезаписывании переменной где-то за пределами процитированного кода.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Это все прекрасно, НО:
1. В остальных blade шаблонах, в т.ч. и в include() данное обращение ( {{ $user->profile->declarer_name }} ) отрабатывает нормально.
Даже в рамках этого же роута, но в другом blade шаблоне, адекватно.
2. Если б сессия была б недоступна на момент $user = Auth::user(), вернуло бы null, но никак не крайнего по ID.
Ни переименование переменной, ни применение ленивой ее загрузки не помогло.
Не в сети
Проверяйте внимательнее blade шаблон тогда. Может где-нибудь выше есть что-то типа:
foreach ($users as $user)
Что естественно перезапишет ваш $user из composer на последнего из списка foreach.
Изменено FrDR (17.04.2018 14:54:58)
Не в сети
FrDR, bingo!
Конечно жжжжешь foreach!
Как иногда ломает выдумывать новые имена переменных.... от-того и накладки.
Спасибо всем за участие.
Не в сети
Всё-таки удивительно устроено человеческое внимание.
подозреваю, что где-то ты начинаешь использовать не ту переменную.
Цель — исключить случайное пересечение с другим $user.
Я считаю что причина ошибки топикстартера в перезаписывании переменной где-то за пределами процитированного кода.
Наверное надо искать более простые и понятные выражения.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети