Запрос группового объекта с пользователем

На самом деле я изучаю Symfony и делаю свой собственный UserBundle по той причине, что мне нужно использовать онлайн-API для управления пользователями. Поэтому я объединил объекты User и Group с отношением доктрины ManyToOne. На данный момент все работает нормально.

Symfony актуализирует объект User на каждой странице и получает идентификатор группы (см. var_dump), но я хочу, чтобы Symfony получал весь объект Group на каждой странице, а не только его идентификатор.

User {#467 ▼
  -id: 104
  -uuid: "~"
  -username: "~"
  -lastLogin: null
  -websiteActivity: null
  -clientToken: "1c667ad4-07e2-4ffa-8db1-9997eadbbc4b"
  -accessToken: "b183f850ce4d4decb07cb7485c1d0a88"
  -dataCheck: DateTime {#457 ▼
    +"date": "2017-08-27 18:23:31.000000"
    +"timezone_type": 3
    +"timezone": "Europe/Berlin"
  }
  -reputation: 0
  -group: Group {#456 ▼
    +__isInitialized__: false
    -id: 4
    -inheritId: null
    -name: null
    -chatColor: null
    -websiteName: null
    -websiteColor: null
     …2
  }
}

Если бы вы знали, как это сделать, это было бы очень полезно.

Большое Вам спасибо.


person Hugo Le Goff    schedule 27.08.2017    source источник
comment
Не уверен, что вы спрашиваете - похоже, что объект User возвращает там объект Group, как вы ожидаете   -  person Jason Roman    schedule 27.08.2017
comment
Он не возвращает весь объект, а только его идентификатор, потому что Symfony получает пользователя только на каждой странице. Объект Group не должен быть пустым.   -  person Hugo Le Goff    schedule 27.08.2017
comment
Обратите внимание, что он не инициализирован - это потому, что вы делаете var_dump() объекта User без каких-либо соединений с объектом Group. Бьюсь об заклад, если вы сделаете var_dump($user->getGroup()->getName()), вы получите ожидаемое значение, а затем будет инициализирована группа, потому что Doctrine затем загрузит этот объект другим запросом. По сути, вы используете var_dump() для отладки и не понимаете базовый уровень. Кроме того, вместо этого используйте dump(); он был представлен в Symfony 2.6 и намного лучше.   -  person Jason Roman    schedule 27.08.2017
comment
Я имею в виду, что я могу вызвать это на всех моих контроллерах, но это будет действительно повторяться, потому что мне это понадобится почти на всех моих страницах. Вот почему я ищу другой способ сделать это. (примечание: я использую дамп)   -  person Hugo Le Goff    schedule 27.08.2017
comment
Мне нужно посмотреть, как ты это называешь. Он автоматически захватывается с помощью ParamFetcher или вы захватываете его непосредственно из EntityManager? Если вы покажете, как вы это делаете, я могу помочь.   -  person Jason Roman    schedule 27.08.2017
comment
(Скажите, если я говорю не о том) Объект User на самом деле автоматически генерируется на каждой странице самой Symfony, которая знает, что пользователь вошел в систему, и которые определяют активную сущность пользователя в сеансе, который вы захватываете вот так $ this-›getUser() на контроллере.   -  person Hugo Le Goff    schedule 27.08.2017
comment
Теперь я понимаю, что вы говорите - посмотрите мой ответ.   -  person Jason Roman    schedule 27.08.2017


Ответы (1)


Имейте в виду, что $this->getUser() на контроллере является псевдонимом для следующего:

$this->container->get('security.token_storage')->getToken()->getUser();

Вы можете посмотреть на Использование пользовательского запроса для загрузки пользователя. Вы можете использовать это для автоматического присоединения к вашей группе:

public function loadUserByUsername($username)
{
    return $this->createQueryBuilder('u')
        ->select('u, g')
        ->leftJoin('u.group', 'g')
        ->where('u.username = :username OR u.email = :email')
        ->setParameter('username', $username)
        ->setParameter('email', $username)
        ->getQuery()
        ->getOneOrNullResult();
}

Это было ранее задокументировано в версиях Symfony ‹= 2.5, но был удален из документации для ясности и потенциально потому что это не было необходимо для большинства случаев. Если вы хотите, вы также можете переместить это в свой UserRepository (если он существует) и вызвать его оттуда.

Это вступит в силу, когда пользователь войдет в систему. Попробуйте это, чтобы увидеть, будет ли автоматически получен ваш объект Group.

person Jason Roman    schedule 27.08.2017
comment
Именно то, что я искал! Спасибо ! - person Hugo Le Goff; 27.08.2017
comment
Можно ли с помощью этой функции загрузить пользователя с идентификатором вместо имени пользователя? - person Hugo Le Goff; 27.08.2017
comment
Ну, функция говорит loadUserByUsername() и обычно имеет место, когда пользователь входит в систему по электронной почте или имени пользователя, но нет никаких причин, по которым вы не могли бы также передать идентификатор этой функции и обновить свой запрос для поиска ->where('u.id = :id)->setParameter('id', $username); - person Jason Roman; 27.08.2017
comment
После прочтения строк за строками короткой документации и множества попыток, которые не работают, я все равно получаю только объект User без группы. Он вообще не вызывает эту функцию. - person Hugo Le Goff; 28.08.2017
comment
Если вы выполняете отладку, этот метод будет вызываться только при первом входе в систему. Вы должны проверить, что эта функция вызывается; Я не думаю, что это будет происходить при каждом запросе. Сначала убедитесь, что это происходит. - person Jason Roman; 28.08.2017
comment
На самом деле я использую Guard в качестве метода входа в систему, поэтому я никогда не вызываю эту функцию, потому что мне нужно только отправить объект пользователя, чтобы сообщить Symfony, какой пользователь подключен. Но я могу показать вам, что на каждой странице выполняется запрос на получение объекта пользователя cdn.discordapp.com/attachments/175326249823109121/ - person Hugo Le Goff; 28.08.2017
comment
Хорошо, тогда я бы сказал, что вам нужно найти, где вызывается этот запрос, и переопределить его ... не зная больше о вашей настройке, я не уверен, где это будет. - person Jason Roman; 28.08.2017
comment
Привет ! После некоторых исследований я узнал, как создать пользовательского провайдера (symfony.com/doc/ current/security/custom_provider.html) с функцией с именем refreshUser, где вызывается функция loadUserByUsername, так что я думаю, это то, что я ищу. - person Hugo Le Goff; 28.08.2017
comment
Запрос, который я хочу, выполняется прямо сейчас, но у меня есть другая проблема: после инициализации пользователя при входе в систему я мгновенно отключаюсь из-за AuthenticationExpiredException. И я явно не знаю, как это исправить на самом деле. - person Hugo Le Goff; 28.08.2017
comment
Звучит как хороший кандидат на новый вопрос :) Я предполагаю, что вы столкнетесь с некоторыми вещами, такими как кодирование пользовательской системы самостоятельно. - person Jason Roman; 28.08.2017
comment
Я думаю да. В общем, спасибо за помощь, которую вы мне оказали, надеюсь, есть такие люди, как вы, чтобы помочь :D - person Hugo Le Goff; 28.08.2017