Symfony形成链接到没有错误的字段的全局错误

时间:2017-01-03 15:08:33

标签: php forms symfony

handleRequest之前的表单:没有全局错误。

Form {#1852 ▼
  -config: FormBuilder {#1851 ▶}
  -parent: null
  -children: OrderedHashMap {#1836 ▶}
  -errors: []
  -submitted: false
  -clickedButton: null
  -modelData: User {#2096 ▶}
  -normData: User {#2096 ▶}
  -viewData: User {#2096 ▶}
  -extraData: []
  -synchronized: true
  -defaultDataSet: true
  -lockSetData: false
}

请求:'firstname'字段已通过。

Request {#3 ▼
  +attributes: ParameterBag {#6 ▶}
  +request: ParameterBag {#4 ▼
    #parameters: array:1 [▼
      "registration" => array:6 [▼
        "firstname" => "foo"
        "lastname" => "bar"
        "email" => "foo@test.com"
        "accountType" => "bbbbbb"
        "school_info" => array:4 [▶]
        "_token" => "1a55e2d7474183267374a0007e15b92e6114158d"
      ]
   ]
  }
...
}

handleRequest之后的表单:来自“firstname”字段的错误消息的全局错误,但字段本身没有错误。

Form {#1852 ▼
-config: FormBuilder {#1851 ▶}
  -parent: null
  -children: OrderedHashMap {#1836 ▼
    -elements: array:5 [▼
      "firstname" => Form {#1835 ▼
        -config: FormBuilder {#1854 ▶}
        -parent: Form {#1852}
        -children: OrderedHashMap {#1853 ▶}
        -errors: []
        -submitted: true
        -clickedButton: null
        -modelData: "poipoi"
        -normData: "poipoi"
        -viewData: "poipoi"
        -extraData: []
        -synchronized: true
        -defaultDataSet: true
        -lockSetData: false
      }
      "email" => Form {#1858 ▶}
      "lastname" => Form {#1861 ▶}
      "accountType" => Form {#1864 ▶}
      "school_info" => Form {#1867 ▶}
    ]
    -orderedKeys: array:5 [▶]
    -managedCursors: []
  }
  -errors: array:3 [▼
    0 => FormError {#728 ▼
      -message: "missing email"
      #messageTemplate: "missing email"
      #messageParameters: array:1 [▶]
      #messagePluralization: null
    }
    1 => FormError {#733 ▼
      -message: "missing firstname"
      #messageTemplate: "missing firstname"
      #messageParameters: array:1 [▶]
      #messagePluralization: null
    }
    2 => FormError {#738 ▼
      -message: "missing lastname"
      #messageTemplate: "missing lastname"
      #messageParameters: array:1 [▶]
      #messagePluralization: null
    }
  ]
  -submitted: true
  -clickedButton: null
  -modelData: User {#2096 ▶}
  -normData: User {#2096 ▶}
  -viewData: User {#2096 ▶}
  -extraData: []
  -synchronized: true
  -defaultDataSet: true
  -lockSetData: false
}

“firstname”,“lastname”和“email”的问题相同。注意错误是如何对表单全局的,并且字段本身没有错误。此外,错误冒泡不会影响问题。

表格类型:

<?php

namespace Acme\SiteBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Acme\SiteBundle\Entity\User;

/**
 *
 */
class RegistrationType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('firstname', null, array('label' => 'firstname'))
            ->add('lastname', null, array('label' => 'lastname'))
            ->add('email', 'email', array('label' => 'form.email'))
            ->add('accountType', 'choice'));

        $builder->add('school_info', 'school_info', array(
                'label' => 'School',
                'cascade_validation' => false,
                'mapped' => false,
                'required' => false,
        ));        
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\\SiteBundle\\Entity\\User',
            'intention' => 'registration',
            'validation_groups' => function (FormInterface $form) {
                $data = $form->getData();
                if ($this->isPro($data)) {
                    return array('HKCustomRegistration', 'account_type_pro');
                } else {
                    return array('HKCustomRegistration', 'account_type');
                }
            },
            'cascade_validation' => true,
        ));
    }

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

}

嵌入表格(school_info)表格类型。

关键点:只有当school_info表单作为注册表单中的字段添加并且填写了shool输入时才会出现此问题(如果未填写,则不会发生错误)。

<?php

namespace Acme\SiteBundle\Form\Type;

use Acme\SiteBundle\Service\SiteProvider;
use Acme\SiteBundle\Entity\School;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityRepository;

class SchoolInfoType extends AbstractType
{
    private $site;

    public function __construct(SiteProvider $siteProvider)
    {
        $this->site = $siteProvider->getCurrentSiteDB();

    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $site = $this->site;
        $builder
            ->add('school', 'entity', array(
                'empty_value' => '------------',
                'class' => 'AcmeSiteBundle:School',
                'query_builder' => function (EntityRepository $er) use ($site) {
                    return $er->createQueryBuilder('sc')
                              ->where('sc.site = :site')
                              ->setParameter('site', $site)
                              ->addOrderBy('sc.name', 'ASC');
                },
                'mapped' => true, // mapped but not persisted
                'label' => 'school',
            ));

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\SiteBundle\Entity\User',
            'site' => null,
        ));
    }

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

实体中的验证限制:

/**
 * @var string
 *
 * @ORM\Column(name="firstname", type="string", length=100, nullable=true)
 * @Assert\NotBlank(groups={"HKCustomRegistration", "HKCustomProfile", "Default", "sylius"}, message="missing firstname")
 */
private $firstname;

1 个答案:

答案 0 :(得分:0)

好的,所以这是一个验证组错误!

schoolInfoType针对默认验证组验证了User实体,默认验证组需要'firstname''lastname''email'。 这有点误导,因为这些字段填写在父表单中。 (不确定'mapped' => false是否在此处发挥作用)。

无论如何,我的解决方案是添加一个没有相关约束的验证组SchoolInfoType

<?php
class SchoolInfoType extends AbstractType
{
    //...
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\SiteBundle\Entity\User',
            'validation_groups' => array('school'),
            'site' => null,
        ));
    }
}
?>