首页 > 解决方案 > Symfony 4 投票者 - OnetoMany 关系

问题描述

我有一个应用程序实体,它存储一个带有用户 ID 的广告 ID

class User implements UserInterface, \Serializable
{
 /**
 * @ORM\OneToMany(targetEntity="App\Entity\Application", mappedBy="author", orphanRemoval=true)
 */
 private $applications;
 }

应用实体

class Application
{

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Advert", inversedBy="applications")
 * @ORM\JoinColumn(nullable=false)
 */
private $advert;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="applications")
 * @ORM\JoinColumn(nullable=false)
 */
private $author;
}

我想要的是一个选民,如果当前用户已经申请了一个特定的广告(在查看广告时),它可以拒绝一个动作

类 AdvertApplicationsVoter 扩展选民 {

protected function supports($attribute, $subject)
{
    return in_array($attribute, ['APP_APPLY', 'ADVERT_APPLY'])  && $subject instanceof Application;
}

/**
 * @param string $attribute
 * @param mixed $subject
 * @param TokenInterface $token
 * @return bool
 */
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
    $user = $token->getUser();
    $apl = $user->getApplications();
    // if the user is anonymous, do not grant access
    if (!$user instanceof User) {
        return false;
    }

    switch ($attribute) {
        case 'APP_APPLY':
            return $this->dw($user, $subject);
            break;
        case 'ADVERT_APPLY':
            // logic to determine if the user can VIEW
            // return true or false
            break;
    }

    return false;
}

private function applied(?User $user, Advert $app)
{
    return $user->getId() === $app->getApplications()->getKeys();
}
private function aa(?User $user, Application $app)
{
    return $user->getApplications() === $app->getAdvert();
}

private function dw(?User $user, Application $app)
{
    foreach($user->getApplications() as $app) {
        if ($app->getAdvert() === $app) {
            return false;
        }
    }
    return true;
 }
}

我被弃权了,我不知道如何调试选民

提前致谢

标签: symfonydoctrine-orm

解决方案


假设您正确设置了您的选民(因此使用supportvoteOnAttribute方法)。

然后你只需要改变你的方法:

private function dw(?User $user, Advert $advert)
{
    foreach($user->getApplications() as $userApplication) {
        if ($userApplication->getAdvert() === $advert) {
            return false;
        }
    }
    return true;
 }
}

您的方法的问题是您正在将ArrayCollection应用程序对象进行比较。


推荐阅读