如何比较两个学说对象?

How to compare two doctrine objects?

使用 symfony 3.4 (php)。如何比较两个对象是否相同?

我的用例如下:我通过

获取登录用户
$user = $this->get('security.token_storage')->getToken()->getUser();

我在 url 中有一个用户 ID,它是通过函数调用

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

现在我想检查这两个用户对象是否相同 - 在这种情况下,我将重定向到显示已登录用户配置文件的页面。

我可以简单地做吗

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

?在这种情况下如何进行比较?我真正想要的是做类似

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

,但我真的很喜欢第一个解决方案,因为它很简单 - 而且它确实有效。但这只是巧合,还是实际上应该如何使用学说?

我从 Java 得知我会实施 equals()hashCode() 方法 - PHP 中有类似的东西吗?

在我上面的两个例子中,使用=====有区别吗?

我认为最干净的方法是使用 ->getId() 比较。 即使是新手也很容易阅读,他们不必想知道 php 如何处理对象相等性(== 表示相同的属性和 class,=== 表示相同的实例引用),或者想知道 symfony/doctrine 可能 return 令牌管理器和学说查询中的相同实例。

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

我无法评论 doctrine / symfony 是否可能 return 两个对象引用上的同一个实例。我不知道。老实说,除非他们对 doctrine/symfony 源代码有非常复杂的了解,否则可能没有人可以确定地预测它(特别是如果你考虑缓存等因素)。

哦,请记住

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

并不总是return用户对象。例如,如果用户未登录,它可以 return 文本。

所以我还要在 if 中添加一个检查(在 id 比较之前)以检查 $user 是否确实是一个实际的 Member 对象。否则,当您尝试访问 getId() 方法时可能会出现异常

$user instanceof Member

顺便说一句,如果你想以正确的 Symfony 方式处理这些东西,保持你的控制器精简和干净,并很好地分离你的代码,你应该创建并注册一个选民并使用类似

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

选民代码的其余部分太多了,无法在此处引用,但即使下面的指南 link 中断,您也应该能够通过谷歌搜索轻松找到有关选民的信息。

TLDR 是您将访问选民指定为标记服务(例如 ProfileVoter)。这些选民获得一个动作(例如view)和一个主题实例(例如$profile)作为参数,然后使用他们的内部代码来决定令牌用户是否有权对主题实例执行该动作(return $user instanceof Member && $user->getId() === $profile->getUser()->getId()).

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