Symfony 4.4表格集合中的嵌入问题



InvalidPropertyPathException

如果我在没有填写数据的情况下提交表格。我得到这个错误。

无法解析属性路径";children〔upcomingTours〕.children〔[0]〕.children[地址〕.childrin[街道〕.数据";。意外的令牌"]"在位置36处。

一些问题:

  1. 这是一个符号错误吗?如果是,版本中是否已修复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,
])
;
}
}

即将推出的旅行类型

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',
])
]
])

;
}
}

旅行控制器

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
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
protected $id;

/**
* @ORMColumn(type="string", nullable=true)
* @AssertNotBlank(message="project.street_not_blank")
*/
private $street;

}

结论

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

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

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

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

最新更新