2014-11-13 5 views
0

Я хочу написать валидацию для форм на моем веб-сайте. Насколько я знаю, Symfony 2 позволяет несколько способов сделать это:Подтверждение только в одном месте - в классах типа типов

  • аннотаций
  • YAML
  • XML
  • в классе сущностей

Ok, но мое дело в том, что На моем веб-сайте у меня много форм, которые я создаю с использованием классов типа форм (например, Project\AcmeBundle\Form\Type\MyFormType).

Таким образом, лучший способ для меня - создать метод внутри проверки типа класса для обработки всех его полей. Что-то вроде:

<?php 

namespace Project\AcmeBundle\Form\Type; 

class UserType extends FormTypeInterface 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('login', 'text', ['required' => false]) 
       ->add('password', 'text', ['required' => false]); 

     $builder->add('Save', 'submit'); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Project\AcmeBundle\Entity\Users' 
     )); 
    } 

    public function validation() 
    { 
     // do something here 
    } 

    public function getName() 
    { 
     return 'user'; 
    } 

} // End UserType 

Это был бы первый вопрос. Мне также было интересно отключить все другие типы проверки - как я могу это сделать?

Большое спасибо!

ответ

0

В первый вопрос, который вы можете использовать Callback constraint, вот пример:

class MyCustomType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('foo', 'number') 
      ->add('bar', 'number') 
     ; 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver 
      ->setDefaults(array(
       'data_class' => 'ENTITY', 
       'constraints' => array(
        new Callback(
         array('callback' => array($this, 'validateForm')) 
        ) 
       ) 
      )); 
    } 

    /** 
    * @param $data 
    * @param ExecutionContextInterface $context 
    */ 
    public function validateForm($data, ExecutionContextInterface $context) 
    { 
     if ($data->getFoo() < 100) { 
      $context 
       ->buildViolation('Invalid Foo.') 
       ->atPath('foo') 
       ->addViolation() 
      ; 
     } 
    } 


    public function getName() 
    { 
     ... 
    } 
} 
+0

Круто, спасибо! Но что, если я захочу использовать ограничения Symfony? – khernik

+0

@khernik Какие ограничения? .. Обратный вызов также является ограничением symfony. – xurshid29

Смежные вопросы