Symfony2表单验证始终返回ERROR:此值不应为空

时间:2013-10-21 17:48:36

标签: php forms validation symfony symfony-forms

我在Symfony2中使用表单时遇到了一个奇怪的问题。

首先,我在此处的实体类annotations中添加了Job验证:

class Job
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @Assert\NotBlank()
     * @Assert\Choice(callback="getTypeValues")
     */
    protected $type;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank()
     */
    protected $company;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $logo;

    /**
     * @Assert\Image()
     */
    protected $file;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @Assert\Url()
     */
    protected $url;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank()
     */
    protected $position;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank()
     */
    protected $location;

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank()
     */
    protected $description;

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank()
     */
    protected $how_to_apply;

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     * @Assert\NotBlank()
     */
    protected $token;

    /**
     * @ORM\Column(type="boolean", nullable=true)
     */
    protected $is_public;

    /**
     * @ORM\Column(type="boolean", nullable=true)
     */
    protected $is_activated;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank()
     * @Assert\Email()
     */
    protected $email;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $expires_at;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $created_at;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    protected $updated_at;

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="jobs")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     * @Assert\NotBlank()
     */
    protected $category;
}

我创建了一个JobType类并在表单中使用它。所以我可以添加工作。

class JobType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('type', 'choice', array('choices' => Job::getTypes(), 'expanded' => true))
            ->add('category')
            ->add('company')
            ->add('file', 'file', array('label' => 'Company logo', 'required' => false))
            ->add('url')
            ->add('position')
            ->add('location')
            ->add('description')
            ->add('how_to_apply', null, array('label' => 'How to apply?'))
            ->add('is_public', null, array('label' => 'Public?'))
            ->add('email')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
                'data_class' => 'Ibw\JobeetBundle\Entity\Job',
            ));
    }

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

这是我的控制器:

public function createAction(Request $request)
{
    $entity = new Job();
    $form = $this->createForm(new JobType(), $entity);
    $form->handleRequest($request);

    if($form->isValid())
    {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('ibw_job_preview', array(
                'company'   => $entity->getCompanySlug(),
                'location'  => $entity->getLocationSlug(),
                'position'  => $entity->getPositionSlug(),
                'token'     => $entity->getToken(),
            )));
    } else {
        return new Response(var_dump($form->getErrorsAsString()));
//            return new Response($form->getErrorsAsString());
//          return $this->render('IbwJobeetBundle:Job:new.html.twig', array(
//                  'form' => $form->createView(),
//              ));
    }
}

现在当我var_dump($form->getErrorsAsString())时,我得到了:

string 'ERROR: This value should not be blank.
type:
    0:
        No errors
    1:
        No errors
    2:
        No errors
category:
    No errors
company:
    No errors
file:
    No errors
url:
    No errors
position:
    No errors
location:
    No errors
description:
    No errors
how_to_apply:
    No errors
is_public:
    No errors
email:
    No errors
' (length=355)

或者当我var_dump($form->getErrors())时,我得到:

array (size=1)
  0 => 
    object(Symfony\Component\Form\FormError)[614]
      private 'message' => string 'This value should not be blank.' (length=31)
      protected 'messageTemplate' => string 'This value should not be blank.' (length=31)
      protected 'messageParameters' => 
        array (size=0)
          empty
      protected 'messagePluralization' => null

我不知道是什么导致了这个ERROR: This value should not be blank.错误。我很难搞清楚。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题。我收到了一个全局错误ERROR: This value should not be blank,但特定字段没有任何错误。

nifr是对的,验证实际上应用于底层对象。问题是在表单将提交的数据应用于对象后对象是否有效。 http://symfony.com/doc/current/book/forms.html#form-validation

此问题的原因是在表单提交后对象的某些字段无效,并且这些字段未包含在表单中。要解决此问题,您可以在验证之前将有效数据传递到对象的字段,或使用验证组仅针对该类的某些约束验证对象。

答案 1 :(得分:3)

删除以下内容:

token:
     - NotBlank: ~

来自src/Ibw/JobeetBundle/Resources/config/validation.yml

答案 2 :(得分:2)

如@cheesemacfly所述,您的问题出在“令牌”字段

它被声称为“非空白”,但它没有包含在表单中,这就是为什么错误没有绑定到任何表单字段,而是表单的全局错误,因为验证发生在实体上,不在表单上(与symfony 1.4不同),因此验证机制无法将其绑定到表单中的字段,因为此属性(标记)没有表单中的字段

相关问题