Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 14.04.2018 22:56:04

Auth::user() возвращает левого пользователя (последнего по БД)

Всем доброго времени суток
Неожиданно увидел, что на одной из страниц Auth::user() возвращает мне не текущего пользователя, а последнего в таблице Users
В странице нет ничего - простая выгрузка контента.
Функция Контроллера также никак не влияет на фасад Auth.
В ViewComposer заведена $user = Auth::user(); для использования в видах.... в общем ничего необычного. И тут на тебе - левый юзер вылезает...
У кого какие мысли где капать?

Не в сети

#2 15.04.2018 10:48:04

Re: Auth::user() возвращает левого пользователя (последнего по БД)

[offtopic]В РСУБД нет понятия "первый" или "последний", т.к. таблицы считаются неупорядоченными множествами. Другими словами, в разных запросах у тебя последними будут разные пользователи smile[/offtopic]

Покажи пожалуйста конкретный кусок кода
1. про view composer и
2. из того места где ты обнаруживаешь не того пользователя.
подозреваю, что где-то ты начинаешь использовать не ту переменную.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 15.04.2018 16:32:26

Re: Auth::user() возвращает левого пользователя (последнего по БД)

ProfileComposer

PHP
<?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());
        ...
    }
}

UserRepository

PHP
<?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;
    }
    ...
}

webinar.blade.php

PHP
...
<
h4>{{ $user->profile->declarer_name }}</h4>
<!-- 
возвращает $user c последним ID -->
...

Не в сети

#4 15.04.2018 18:31:55

Re: Auth::user() возвращает левого пользователя (последнего по БД)

Я бы для проверки изменил $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 15.04.2018 19:43:16

Re: Auth::user() возвращает левого пользователя (последнего по БД)

С версии 5.3, по умолчанию, у вас нет доступа к сессиям в конструкторе.
Есть два пути решения проблемы:
1. https://laravel.com/docs/5.3/upgrade#5. … nstructors
2. https://stackoverflow.com/questions/415 … onstructor

Не в сети

#6 16.04.2018 05:39:45

Re: Auth::user() возвращает левого пользователя (последнего по БД)

@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.

Не в сети

#7 16.04.2018 06:17:06

Re: Auth::user() возвращает левого пользователя (последнего по БД)

Можно применить ленивую инициализацию чтобы не создавать 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.

Не в сети

#8 17.04.2018 14:45:29

Re: Auth::user() возвращает левого пользователя (последнего по БД)

Это все прекрасно, НО:
1. В остальных blade шаблонах, в т.ч. и в include() данное обращение ( {{ $user->profile->declarer_name }} ) отрабатывает нормально.
Даже в рамках этого же роута, но в другом blade шаблоне, адекватно.
2. Если б сессия была б недоступна на момент $user = Auth::user(), вернуло бы null, но никак не крайнего по ID.

Ни переименование переменной, ни применение ленивой ее загрузки не помогло.

Не в сети

#9 17.04.2018 14:52:58

Re: Auth::user() возвращает левого пользователя (последнего по БД)

Проверяйте внимательнее blade шаблон тогда. Может где-нибудь выше есть что-то типа:
foreach ($users as $user)
Что естественно перезапишет ваш $user из composer на последнего из списка foreach.

Изменено FrDR (17.04.2018 14:54:58)

Не в сети

#10 17.04.2018 15:18:50

Re: Auth::user() возвращает левого пользователя (последнего по БД)

FrDR, bingo!
Конечно жжжжешь foreach!
Как иногда ломает выдумывать новые имена переменных.... от-того и  накладки.
Спасибо всем за участие.

Не в сети

#11 18.04.2018 06:04:17

Re: Auth::user() возвращает левого пользователя (последнего по БД)

Всё-таки удивительно устроено человеческое внимание.

подозреваю, что где-то ты начинаешь использовать не ту переменную.

Цель — исключить случайное пересечение с другим $user.

Я считаю что причина ошибки топикстартера в перезаписывании переменной где-то за пределами процитированного кода.

Наверное надо искать более простые и понятные выражения. smile


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

Подвал раздела