Группы проверки достоверности форм Symfony2 без объектов

Я использую компонент формы Symfony2 для создания и проверки форм. Теперь мне нужно настроить группы валидаторов на основе одного значения поля, и, к сожалению, кажется, что каждый пример там основан на объектах, которые им не используются по нескольким причинам.

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

Другими словами, то, что я пытаюсь достичь, делает subforms необязательным, но все же проверяем, заполняется ли ключевое поле.

Может ли кто-нибудь дать мне пример, как его настроить?

<?php namespace CoreBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Symfony\Component\Validator\Constraints as Assert; use CoreBundle\Form\Type\ItemGroupOption; class ItemGroup extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('title', 'text', array( 'label' => 'Titel', 'attr' => array('class' => 'span10 option_rename'), 'required' => false )); $builder->add('max_selections', 'integer', array( 'label' => 'Max tilvalg', 'constraints' => array(new Assert\Type('int', array('groups' => array('TitleProvided')))), 'attr' => array('data-default' => 0) )); $builder->add('allow_multiple', 'choice', array( 'label' => 'Tillad flere valg', 'constraints' => array(new Assert\Choice(array(0,1))), 'choices' => array(0 => 'Nej', 1 => 'Ja') )); $builder->add('enable_price', 'choice', array( 'label' => 'Benyt pris', 'constraints' => array(new Assert\Choice(array(0,1))), 'choices' => array(0 => 'Nej', 1 => 'Ja'), 'attr' => array('class' => 'option_price') )); $builder->add('required', 'choice', array( 'label' => 'Valg påkrævet', 'constraints' => array(new Assert\Choice(array(0,1))), 'choices' => array(0 => 'Nej', 1 => 'Ja') )); $builder->add('options', 'collection', array( 'type' => new ItemGroupOption(), 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false ) ); $builder->add('sort', 'hidden'); } public function getName() { return 'item_group'; } public function setDefaultOptions(OptionsResolverInterface $resolver) { global $app; $resolver->setDefaults(array( 'validation_groups' => function(FormInterface $form) use ($app) { // Get submitted data $data = $form->getData(); if (count($app['validator']->validateValue($data['title'], new Assert\NotBlank())) == 0) { return array('TitleProvided'); } else { return false; } }, )); } } 

Related of "Группы проверки достоверности форм Symfony2 без объектов"

Если вы используете 2.1, вы можете захотеть взглянуть на «Группы на основе представленных данных» .

Обновить

Пример использования демонстрационной контактной страницы /demo/contact в стандартном AcmeDemoBundle поставляемом с Symfony Standard Edition:

Тип формы с условными группами проверки:

 namespace Acme\DemoBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Symfony\Component\Validator\Constraints as Assert; class ContactType extends AbstractType { // Inject the validator so we can use it in the closure /** * @var Validator */ private $validator; /** * @param Validator $validator */ public function __construct(Validator $validator) { $this->validator = $validator; } public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('email', 'email'); $builder->add('message', 'textarea', array( // Added a constraint that will be applied if an email is provided 'constraints' => new Assert\NotBlank(array('groups' => array('EmailProvided'))), )); } public function setDefaultOptions(OptionsResolverInterface $resolver) { // This is needed as the closure doesn't have access to $this $validator = $this->validator; $resolver->setDefaults(array( 'validation_groups' => function(FormInterface $form) use ($validator) { // Get submitted data $data = $form->getData(); $email = $data['email']; // If email field is filled it will not be blank // Then we add a validation group so we can also check message field if (count($validator->validateValue($email, new Assert\NotBlank())) == 0) { return array('EmailProvided'); } }, )); } public function getName() { return 'contact'; } } 

Не забудьте ввести службу validator в тип формы:

 <?php namespace Acme\DemoBundle\Controller; //... class DemoController extends Controller { // ... public function contactAction() { $form = $this->get('form.factory')->create(new ContactType($this->get('validator'))); // ... } } 

Как вы можете видеть, проверка поля message будет инициирована только в том случае, если поле email заполнено.

Используйте инструмент diff, чтобы поймать различия.