InvalidPropertyPathException
如果我在没有填写数据的情况下提交表格。我得到这个错误。
无法解析属性路径";children〔upcomingTours〕.children〔[0]〕.children[地址〕.childrin[街道〕.数据";。意外的令牌"]"在位置36处。
一些问题:
- 这是一个符号错误吗?如果是,版本中是否已修复5.x
- 有人遇到过这个错误吗
- 有人能解决这个问题吗
提前感谢您的回复
这是我的表单的层次结构
- 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))
中