嵌入 Symfony 4.4 形式集合的问题

问题描述

InvalidPropertyPathException

如果我提交了表格,而没有填写数据。我收到此错误

无法解析属性路径“children[upcomingTours].children[[0]].children[address].children[street].data”。位置 36 处出现意外标记“]”。

一些问题:

  1. 这是一个 symfony 错误吗?如果是这样,它是否已经在版本中修复 5.x?
  2. 有人遇到过这个错误吗?
  3. 有没有人有解决这个问题的方法

提前感谢您的回复

这是我表单的层次结构

 - TourType (custom form)
        - UcomingTour (CollectionType)
             - Addresstype (custom form)

HTLM

<div>
<label for="tour_upcomingTours_0_address_street">Adresse</label>
<input type="text" 
       id="tour_upcomingTours_0_address_street" 
       name="tour[upcomingTours][0][address][street]" 
       placeholder="Tapez un nom de rue">
</div>

旅游类型

class TourType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder
            ......
            ->add('upcomingTours',CollectionType::class,[
                'label' => false,'entry_type' => UpcomingTourType::class,'allow_delete' => true,'allow_add' => true,'by_reference' => false,])
        ;
    }
}

UpcomingTourType

class UpcomingTourType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder
             .........
             ->add('address',Addresstype::class,[
                    'label' => false,])
    }

}

地址类型

class Addresstype extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder
            ............
            ->add('street',null,[
                'required' => false,'label' => 'admin.address_line','attr' => [ 'placeholder' => 'admin.placeholder_line'],'constraints' => [
                    new NotNull([
                        'message' => 'project.street_not_blank',])
                ]
            ])
           
        ;
    }
}

TourController

class TourController extends AbstractController
{
    /**
     * @Route("/tour/new/",name="dashboard_tour_new",methods={"GET","POST"},*          defaults={"_locale" = "%locale%"},*          requirements={"_locale" = "%app_locales%"})
     */
    public function new(Request $request): Response
    {
        $tour = new Tour();
        $upcomingTour = new UpcomingTour();
        $tour->getUpcomingTours()->add($upcomingTour);
        $form = $this->createForm(TourType::class,$tour);
        $form->handleRequest($request);
        ...

    }
}

解决方法

我找到了解决方案。

问题

问题的根源在于表单上约束的验证。 Symfony collectionType 在尝试映射地址表单时遇到问题

解决方案

解决方法如下:

  • 我删除了表单中对合同的评估并将其放入实体中。

我删除此代码:

'constraints' => [
    new NotNull([
          'message' => 'project.street_not_blank',])
 ]

地址类型

class AddressType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder
            ............
            ->add('street',null,[
                'required' => false,'label' => 'admin.address_line','attr' => [ 'placeholder' => 'admin.placeholder_line'],])
           
        ;
    }
}

然后我把它放在实体中

实体地址

class Address extends BaseEntity
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    protected $id;


    /**
     * @ORM\Column(type="string",nullable=true)
     * @Assert\NotBlank(message="project.street_not_blank")
     */
    private $street;

}

结论

我认为这是一个 symfony 的错误,对我来说它必须支持这两个 方法

,

尝试从控制器中删除以下几行

$upcomingTour = new UpcomingTour();
$tour->getUpcomingTours()->add($upcomingTour);

或将这些行包裹在 if ($request->isMethod(Request::METHOD_GET))