下午好。我想在默认表单中添加隐藏字段中选定的作者。添加按预期发生,但在录制过程中我得到:
Could not determine access type for property "id".
现在顺序:
控制器。这里我设置了mentor的默认值。在表格中,一切都按应有的方式显示。
public function newAction(Request $request)
{
$meeting = new Meeting();
$meeting->setMentor($this->getUser());
$form = $this->createForm('App\AdminBundle\Form\MeetingType', $meeting);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($meeting);
$em->flush($meeting);
return $this->redirectToRoute('meeting_show', array('id' => $meeting->getId()));
}
return $this->render('meeting/new.html.twig', array(
'meeting' => $meeting,
'form' => $form->createView(),
));
}
表格。
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
...
->add('mentor', HiddenType::class,[
'property_path' => 'mentor.id'
])
...
}
而且,实际上,这个表单的字段在 html 中。这里的一切都很棒。
<input type="hidden" id="app_adminbundle_meeting_mentor" name="app_adminbundle_meeting[mentor]" value="1">
在您的用户(导师)类中,没有设置 ID 的标准方法。写入时,symfony 尝试将值 (id) 写在那里,但不能这样做,因为 没有 setter (
setId($id)) 并且属性本身不公开。选项:
你真的需要表格上的这个字段吗?也许
$meeting->setMentor($this->getUser());只在写入数据库之前调用才有意义。为了防止表单尝试向对象写入值,您可以设置字段选项
mapped => false,但是您必须手动设置字段的值:data => $id,一般来说,它看起来像这样:->add('mentor', HiddenType::class,[ 'mapped' => false, 'data' => $id, ])使用数据映射器。顺便说一句,没有多少人知道他们。由于某种原因,它们在文档中被省略了,但是这个东西非常强大。
将setId($id) 方法添加到用户类中可以只是一个没有主体的函数。这种解决方法是非常值得怀疑的,尽管它会起作用。但是,再次重申,至少出于审美原因,您不应该这样做。