如何比较两个学说对象?

时间:2018-06-16 07:04:12

标签: php symfony compare equality symfony-3.4

使用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中有类似的东西吗?

在上面的两个示例中,使用=====之间有区别吗?

1 个答案:

答案 0 :(得分:1)

我认为最干净的方法是使用-> getId()比较。 即使是新手,也很容易读懂,不必怀疑php如何处理对象平等(==表示相同的属性和类,===表示相同的实例引用),或者不知道symfony / doctrine是否可能在令牌管理器和原则查询中。

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

我无法评论doctrine / symfony是否在两个对象引用上都返回相同的实例。我不知道。坦白地说,除非他们对教义/ symfony源代码有非常复杂的了解,否则任何人都无法确定地预测它(特别是如果考虑诸如缓存之类的事情)。

哦,请记住

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

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

因此,我还将在if(在ID比较之前)内添加一个检查,以检查$ user是否确实是一个实际的Member对象。否则,当您尝试访问getId()方法时会得到异常

$user instanceof Member

顺便说一句,如果您想以正确的Symfony方式处理此类内容,请保持控制器的简洁和整洁,并很好地分隔代码,则应创建并注册Voter并使用类似的

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

选民代码的其余部分在这里引用过多,但是即使下面的指南链接中断,您也可以通过谷歌搜索轻松地找到有关选民的信息。

TLDR是您将访问投票者指定为标记的服务(例如ProfileVoter)。这些选民获得一个动作(例如视图)和一个主题实例(例如$ profile)作为参数,然后使用其内部代码来确定令牌用户是否有权对该主题实例执行该动作(返回$ user实例&& $ user-> getId()=== $ profile-> getUser()-> getId())。

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