问题描述
InvalidPropertyPathException
如果我提交了表格,而没有填写数据。我收到此错误。
无法解析属性路径“children[upcomingTours].children[[0]].children[address].children[street].data”。位置 36 处出现意外标记“]”。
一些问题:
提前感谢您的回复
这是我表单的层次结构
- 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))