Динамически изменять ограничения утверждения объекта без FormType

#php #symfony #validation #entity

#php #symfony #проверка #сущность

Вопрос:

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

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

 private $id;

    /**
     * @var
     * @AssertLength(max="255")
     * @CustomAssertOrderExternalCode()
     * @CustomAssertOrderShipNoExternalCode()
     */
    private $code;

    private $someId;

    /**
     * @var
     * @AssertNotBlank()
     * @AssertLength(max="255")
     */
    private $number;
  

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

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

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

Комментарии:

1. Вы могли бы использовать службу проверки подлинности Symfony в вашем контроллере: symfony.com/doc/current/validation.html

2. Я делаю это, но мне нужно добавить дополнительное ограничение, основанное на некотором условии для определенного поля.

Ответ №1:

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

Комментарии:

1. Да, именно так я это и сделал

Ответ №2:

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

 use MyCustomMyConstraint;
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyComponentValidatorContextExecutionContextInterface;

// This is not tested !
class MyEntity
{
    /**
     * @AssertCallback()
     */
    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

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

Комментарии:

1. Я думаю, что это не работает, потому что мне нужно проверить поле из базы данных, которое у меня уже есть в контроллере!

2. Если это поле находится в том же объекте, то вам не нужно извлекать его из базы данных. Если он находится в другом объекте, то вы все равно должны выполнить вызов DB…

3. К сожалению, это не один и тот же объект, в этом проблема, я пытаюсь сделать это без вызова DB :/

4. Ну, ваши данные находятся в БД, поэтому вы не можете просто волшебным образом вытащить их из воздуха. Либо извлекайте его при отображении формы и добавляйте в форму в качестве скрытого поля в проверяемой сущности (и используйте ограничение обратного вызова с полезной нагрузкой), либо извлекайте его после отправки и проверяйте по нему.

5. Я упомянул в вопросе, что я не использую FormType, и у меня уже есть объект DB в контроллере, и именно поэтому я хотел узнать, знает ли кто-нибудь другой способ добавить определенную проверку в объект 🙂

Ответ №3:

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

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

     /**
      * @var
      * @AssertNotBlank(groups={"extra_check"})
      * @AssertLength(max="255")
      */
     private $externalId;
  

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

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

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