Изменения Entity assert ограничиваются динамически без FormType - PullRequest
0 голосов
/ 12 апреля 2019

Итак, проблема в следующем:

Я пытаюсь сохранить некоторые данные из API, и мне нужно проверить их с помощью проверки Symfony, например:

private $id;

    /**
     * @var
     * @Assert\Length(max="255")
     * @CustomAssert\OrderExternalCode()
     * @CustomAssert\OrderShipNoExternalCode()
     */
    private $code;

    private $someId;

    /**
     * @var
     * @Assert\NotBlank()
     * @Assert\Length(max="255")
     */
    private $number;

это работает хорошо, но теперь мне нужно динамически добавить некоторые ограничения Assert из контроллера, и я тут застрял!

Кто-нибудь знает, как это сделать или какие-либо предложения, которые могут помочь?

В настоящее время я сделал дополнительное ограничение, которое выполняет дополнительный запрос в БД, и я не хочу этого делать, и я не использую FormType.

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Вы можете использовать groups и использовать (или не указывать) дополнительную группу, о которой вы говорите.

0 голосов
/ 13 апреля 2019

Итак, я хотел динамически проверить данные запроса на основе условия в контроллере.

Я указал дополнительную группу для этого в сущности следующим образом:

    /**
      * @var
      * @Assert\NotBlank(groups={"extra_check"})
      * @Assert\Length(max="255")
      */
     private $externalId;

Тогда в контроллере я только что выполнил условие для проверки с дополнительной группой или нет.

$groups = $order->getExternalCode() != null ? ['Default'] : ['Default', 'extra_check'];
$this->validateRequest($request, null, $groups);

Группа по умолчанию - это та, в которой группа не указана, а другая - это группа, указанная в поле

0 голосов
/ 12 апреля 2019

Использование CallbackConstraint должно помочь, я думаю, в вашем случае:

use My\Custom\MyConstraint;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

// This is not tested !
class MyEntity
{
    /**
     * @Assert\Callback()
     */
    public function validateSomeId(ExecutionContextInterface $context)
    {
        $constraint = new MyConstraint(['code' => $this->code]);
        $violations = $context->getValidator()->validate($this->number, $constraint);

        foreach ($violations as $violation) {
            $context->getViolations()->add($violation);
        }
    }
}

См. https://symfony.com/doc/current/reference/constraints/Callback.html

РЕДАКТИРОВАТЬ: я не знаючто вы пытаетесь проверить, поэтому я просто поместил туда несколько случайных параметров вашей сущности

...