使用注入表单Symfony2进行表单验证

时间:2015-02-06 11:27:06

标签: php forms symfony

问题:提交表单时没有数据,isValid()返回true。

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

   <?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 ]

Validation.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));
    }

}

如果有人可以帮助我,我会非常感激....

1 个答案:

答案 0 :(得分:0)

哼了一段时间也遇到了这个问题而且还没想到 - 我是symfony的新手,我粗略的搜索引擎搜索显示了nada,我也很欣赏这里的quickmefix!