5

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.このエラーの原因がわかりません。私はそれを理解するのに苦労しています。どんな助けでも大歓迎です。

4

3 に答える 3

5

私はちょうど同じ問題を抱えていました。グローバル エラーERROR: This value should not be blankが発生しましたが、特定のフィールドにエラーはありませんでした。

nifrは正しく、検証は実際には基礎となるオブジェクトに適用されます。問題は、フォームが送信されたデータをオブジェクトに適用した後、オブジェクトが有効かどうかです。http://symfony.com/doc/current/book/forms.html#form-validation

この問題の原因は、オブジェクトの一部のフィールドがフォームの送信後に無効になり、これらのフィールドがフォームに含まれていないことにあります。この問題を解決するには、検証の前に有効なデータをオブジェクトのフィールドに渡すか、検証グループを使用して、クラスの制約の一部のみに対してオブジェクトを検証します。

于 2014-04-04T15:21:36.470 に答える
4

以下を削除します。

token:
     - NotBlank: ~

からsrc/Ibw/JobeetBundle/Resources/config/validation.yml

于 2014-09-19T08:24:56.603 に答える
2

@cheesemacflyが述べたように、あなたの問題は「トークン」フィールドにあります

「空白ではない」と主張されていますが、フォームには含まれていません。そのため、エラーはフォーム フィールドのいずれにもバインドされておらず、むしろフォームのグローバル エラーです。フォーム (symfony 1.4 とは異なる) であるため、このプロパティ (トークン) はフォームにフィールドを持たないため、検証メカニズムはそれをフォームのフィールドにバインドできません。

于 2014-05-07T08:42:02.223 に答える