Как сравнить два объекта доктрины?

Использование symfony 3.4 (php). Как сравнить два объекта, одинаковы ли они?

Мой вариант использования выглядит следующим образом: я получаю зарегистрированного пользователя через

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

и у меня есть идентификатор пользователя, указанный в URL-адресе, который предоставляется через вызов функции

public function showUserAction(Request $request, Member $userToDisplay) { ...

Теперь я хочу проверить, одинаковы ли эти два пользовательских объекта - в этом случае я бы перенаправил на страницу, которая показывает профиль вошедшего в систему пользователя.

Могу я просто сделать

if ($user === $userToDisplay) { ... }

? Как в этом случае проводится сравнение? Я действительно хочу сделать что-то вроде

if ($user->getId() === $userToDisplay->getId()) { ... }

, но мне очень нравится первое решение из-за его простоты - и оно действительно работает. Но это просто совпадение или это действительно то, как предполагается использовать доктрину?

Я знаю из Java, что я бы реализовал методы equals() и hashCode() - есть ли что-то подобное в PHP?

В двух приведенных выше примерах есть ли разница между использованием == и ===?

Следуйте руководству: php.net/manual/en/language.oop5.object-comparison.php

u_mulder 16.06.2018 09:16

И второе решение - это больше точный, оно показывает, что действительно нужно сравнивать, и я полагаю, что оно быстрее. Я бы использовал это.

u_mulder 16.06.2018 09:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
4 682
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На мой взгляд, самым чистым способом было бы использовать сравнение -> getId (). Его легко читать даже новичкам, которым не нужно задаваться вопросом, как php обрабатывает равенство объектов (== означает одни и те же свойства и класс, === означает те же ссылки на экземпляры), или задаваться вопросом, может ли symfony / doctrine возвращать тот же экземпляр в token manager и в запросе доктрины.

http://php.net/manual/en/language.oop5.object-comparison.php

Я не могу комментировать, может ли doctrine / symfony возвращать один и тот же экземпляр для обеих ссылок на объекты. Я не знаю. И, честно говоря, никто, вероятно, не сможет предсказать это с уверенностью (особенно если учесть такие вещи, как кеширование), если у них нет очень сложных знаний об исходном коде doctrine / symfony.

О, и имейте в виду, что

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

не всегда возвращает объект пользователя. Например, он может возвращать текст, если пользователь не вошел в систему.

Поэтому я бы также добавил проверку внутри if (перед сравнением идентификаторов), чтобы проверить, действительно ли $ user является фактическим объектом-членом. В противном случае вы можете получить исключение при попытке доступа к методу getId ().

$user instanceof Member

Между прочим, если вы хотите обрабатывать такие вещи правильным образом Symfony, держите свой контроллер компактным и чистым и красиво отделите свой код, вы должны создать и зарегистрировать избирателя и использовать что-то вроде

if ($this->isGranted('view', $profile)){...}

Остальная часть кода избирателя - это слишком много, чтобы здесь цитировать, но даже если указанная ниже ссылка на руководство не работает, вы сможете легко найти информацию об избирателях, выполнив поиск в Google.

TL; DR заключается в том, что вы указываете голосующих за доступ как помеченные услуги (например, ProfileVoter). Эти избиратели получают действие (например, представление) и экземпляр субъекта (например, $ profile) в качестве параметров, а затем используют свой внутренний код, чтобы решить, имеет ли пользователь токена право выполнять действие с экземпляром субъекта (вернуть $ user instanceof Member && $ user-> getId () === $ profile-> getUser () -> getId ()).

https://symfony.com/doc/3.4/security/voters.html

Другие вопросы по теме