Symfony 3 | Пользовательские ограничения для сущностей CollectionType

Я следил за документацией и смог добавить собственные ограничения для многих своих полей (http://symfony.com/doc/current/validation/custom_constraint.html).

Я выясняю проблему с полем CollectionType. Мое настраиваемое ограничение просто проверяет, не коснулся ли пользователь нескольких пробелов в поле (ограничение в любом случае не имеет значения).

У меня есть форма вопроса с заголовком и ответами:

$builder
    ->add('title', TextType::class)
    ->add('answers', CollectionType::class, array(
            'entry_type'    => AnswerType::class,
            'allow_add'     => true,
            'allow_delete'  => true,
            'by_reference' => false
        ))

У меня есть ограничение:

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class ContainsText extends Constraint
{
    public $message = 'constraint_error';
}

И мой валидатор ограничений:

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class ContainsTextValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        // It checks if user didn't had multiple space in field
        if (strlen(trim($value)) == 0) {
            $this->context->buildViolation($constraint->message)
                ->addViolation();
        }
    }
}

В моих сущностях:

Вопрос:

use XX\XXBundle\Validator\Constraints as CustomAssert;    

class Question 
{
    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=255, unique=true)
     * @CustomAssert\ContainsText    
     */
    private $title;
    ...
}

Ответ:

use XX\XXBundle\Validator\Constraints as CustomAssert; 

class Answer 
{
    /**
     * @var string
     *
     * @ORM\Column(name="text", type="string", length=255, unique=true)
     * @CustomAssert\ContainsText    
     */
    private $text;
    ...
}

В моей проверке формы, если в заголовке вопроса я нажимаю много пробелов, я получаю сообщение об ошибке проверки формы с моим сообщением "constraint_error" => Все работает.

Но если в тексте ответов на вопросы я нажимаю много пробелов, проверка формы не возвращает никаких ошибок, и мой вопрос создается с пустыми ответами!

Кажется, что если поле поступает из CollectionType, пользовательские утверждения игнорируются.

Я не понимаю, если бы у меня был Assert (например, @Assert \ Blank (), а не пользовательский) в тексте ответа, даже если мы находимся в CollectionType, утверждение не игнорируется, и я не могу проверить форма с пустым ответом.

Что я здесь пропустил? TY


person Aximem    schedule 17.10.2016    source источник
comment
Я немного запутался :) В заголовке указано Symfony3, а в имени тега указано symfony2. В любом случае ответы охватывают и то, и другое;)   -  person Jovan Perovic    schedule 17.10.2016
comment
Извини, что плохо, это Symfony 3   -  person Aximem    schedule 17.10.2016


Ответы (1)


Не уверен, какую версию Symfony 2 вы используете, но в зависимости от того, до 2.8 или новее, у вас есть разные способы решить эту проблему:

v2.8 + и v3.0 +

Начиная с v2.8, который, как я подозреваю, вы могли использовать при заданном AnswerType::class, cascade_validation устарел. Вместо этого вам нужно применить Valid ограничение к своему Question::$answers члену класса. Что-то вроде этого:

class Question 
{
    /**
     * ... Other anotaions go here 
     *
     * @Assert\Valid()
     */
    private $answers
}

До версии 2.8:

Вам необходимо указать cascade_validation опцию:

$builder
    ->add('title', TextType::class)
    ->add('answers', CollectionType::class, array(
            'entry_type'    => AnswerType::class,
            'allow_add'     => true,
            'allow_delete'  => true,
            'by_reference' => false,
            'cascade_validation' => true // <========= THIS
        ));

Надеюсь это поможет...

person Jovan Perovic    schedule 17.10.2016
comment
Именно то, что мне было нужно, я использую Symfony 3, я не знал, что мне нужно использовать @Assert \ Valid (), чтобы не игнорировать мои пользовательские валидаторы в CollectionType. TY Йован Перович! - person Aximem; 17.10.2016
comment
Спасибо, ребята, за вопрос и следующий ответ. Я оказался в такой же ситуации и не смог понять, что сделал не так! - person Lunin Roman; 13.12.2017