使用注入表单符号进行表单验证2


Form Validation Using Injected Forms Symfony2

问题:当表单在没有数据的情况下提交时,isValidat()返回true。

表单实体(数据类),存储提交的数据:

   <?php
    namespace Bookboon'Premium'AppBundle'Entity;

     class Form {
    protected $email;
    protected $id;
    protected $type;
    protected $voucher;
    protected $subscription;
    protected $affiliate;
    public function getEmail(){
        return $this->email;
    }
    public function setEmail($email){
        $this->email = $email;
    }
    public function getId(){
        return $this->id;
    }
    public function setId($id){
        $this->id = $id;
    }
    public function getType(){
        return $this->type;
    }
    public function setType($type){
        $this->type = $type;
    }
    public function getVoucher(){
        return $this->voucher;
    }
    public function setVoucher($voucher){
        $this->voucher = $voucher;
    }
    public function setSubscription($subscription){
        $this->subscription = $subscription;
    }
    public function getSubscription(){
        return $this->subscription;
    }
    public function setAffiliate($affiliate){
        $this->affiliate = $affiliate;
    }
    public function getAffiliate(){
        return $this->affiliate;
    }
    }

表单类型类别:

namespace Bookboon'Premium'AppBundle'Form;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Bookboon'Premium'AppBundle'Entity;
use Symfony'Component'OptionsResolver'OptionsResolverInterface;
class SignUpFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email', 'email', array('label'=>' ',
                                          'attr' => array('placeholder'=>'Your email', 'class'=>'email')))
            ->add('save', 'submit', array(  'label'=>'Access Premium',
                                            'attr'=>array('class'=>'btn btnProceed'),
                                            'validation_groups' => true))
            ->add('facebook', 'submit', array( 'validation_groups' => false,
                                               'attr' =>array('class'=>'btn btnFacebook cancel')))
            ->add('linkedin', 'submit', array( 'validation_groups' => false,
                                               'attr' =>array('class'=>'btn btnLinkedIn cancel')))
            ->add('id', 'hidden')
            ->add('type', 'hidden')
            ->add('voucher', 'hidden');
    }
    public function getName()
    {
        return 'SignUpForm';
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Bookboon'Premium'AppBundle'Entity'Form',
        ));
    }
}

Services.yml(模板服务和构建器服务都是编写的,只是为了便于阅读而在此处提交):

 premium.form.sign_up:
        class: Bookboon'Premium'AppBundle'Form'SignUpFormType
        tags:
            - { name: form.type, alias: SignUpForm }

    premium.controller.signup:
        class: Bookboon'Premium'AppBundle'Controller'SignUpController
        arguments: [ @templating, @form.builder, @premium.form.sign_up ]

验证.yml:

Bookboon'Premium'AppBundle'Entity'Form:
    properties:
        email:
            - NotBlank: ~

表单控制器:

namespace Bookboon'Premium'AppBundle'Controller;
use Bookboon'Premium'AppBundle'Form'SignUpFormType;
use Symfony'Bundle'FrameworkBundle'Templating'EngineInterface;
use Symfony'Component'Form'FormBuilder;
use Symfony'Component'HttpFoundation'Request;

class SignUpController implements DetectionController
{
    private $_templating;
    private $_formBuilder;
    private $_form;
    public function __construct(EngineInterface $templating, FormBuilder $formBuilder, SignUpFormType $signUpFormType)
    {
        $this->_templating = $templating;
        $this->_formBuilder = $formBuilder;
        $this->_form = $signUpFormType;
    }

    public function signUpAction(Request $request)
    {
        $form = $this->_formBuilder->create($this->_form->getName(), $this->_form);
        $form = $form->getForm();

        $form->handleRequest($request);
        dump($form->isValid()); // Returns true regardless of data (even if blank)
        if($request->getMethod() == 'POST'){
            if($form->isValid()){
                dump('yata!');
            }
            return $this->renderForm($form->createView(), 'signup');
        }
        return $this->renderForm($form->createView(), 'signup');
    }
    public function renderForm($form, $type)
    {
        return $this->_templating->renderResponse( 'PremiumBundle:Connect:'.$type.'.html.twig', array('form'=>$form));
    }
}

如果有人能帮我做这件事,我会非常感激。。。。

嗯不久前也遇到了这个问题,还没有想到——我是symfony的新手,我粗略的搜索引擎搜索显示了nada,我也很感激这里的快速修复!