繁体   English   中英

如何比较两个学说的对象?

[英]How to compare two doctrine objects?

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

我的用例如下:我通过获得登录用户

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

我在通过函数调用提供的网址中提供了一个用户ID

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

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

我可以简单地做吗

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

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

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

,但由于它的简单性,我非常喜欢第一个解决方案-而且它确实有效。 但这仅仅是一个巧合,还是这实际上应该被用来使用该学说?

我从Java知道我将实现equals()hashCode() -方法-PHP中是否有类似的东西?

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

我认为最干净的方法是使用-> 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)){...}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM