Избиратели Symfony 4 - отношения OnetoMany - PullRequest
1 голос
/ 03 октября 2019

У меня есть объект Application, в котором хранится идентификатор объявления с идентификатором пользователя

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

Объект Application

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;
 }
}

Я получаю доступ воздержался, я не знаюкак отладить избирателя

Заранее спасибо

1 Ответ

1 голос
/ 03 октября 2019

При условии, что вы правильно настроили своего избирателя (то есть с поддерживает и voiceOnAttribute метод).

Тогда вам просто нужно изменить свой метод:

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

Проблема вашего метода в том, что вы сравниваете ArrayCollection с объектом приложения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...