【问题标题】:How to compare two doctrine objects?如何比较两个教义对象?
【发布时间】:2018-06-16 07:04:12
【问题描述】:

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

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

【问题讨论】:

标签: php symfony compare equality symfony-3.4


【解决方案1】:

在我看来,最简洁的方法是使用 ->getId() 比较。 即使是新手也很容易阅读,他们不必想知道 php 如何处理对象相等(== 表示相同的属性和类,=== 表示相同的实例引用),或者想知道 symfony/doctrine 是否会在令牌管理器和学说查询。

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

我无法评论说教义/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

【讨论】:

    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多