【发布时间】:2020-12-09 22:56:19
【问题描述】:
我正在使用 symfony 2.8 和学说(你会看到还在学习)。
我有这个控制器,我在其中创建一些表单并渲染它。 我不明白 symfony 怎么可能知道下面的 $contract 对象的类型。 然而,这些 $contract 对象最终会出现在我的数据库中的 contract 表中,所以一定有什么(魔术?)我不明白。
class MyContractsController extends BaseController
{
public function addAction(Request $request)
{
$form = $this->createForm(MultiNewType::class)->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
foreach ($form->getData()['contracts'] as $contract) {
$em->persist($contract);
}
$em->flush();
return $this->validResponse();
}
return $this->renderModalFormResponse($form, array(
'formTemplate' => 'MyBundle:Form:Contract/multiNew.html.twig'
));
}
在 MultiNewType 文件下方,我没有看到任何与合同相关的内容。
class MultiNewType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('contracts', 'collection', array(
'type' => new NewInlineType(),
'allow_add' => true,
'allow_delete' => true,
'delete_empty' => true,
'label' => false
));
}
public function getName()
{
return 'contractMultiNew';
}
}
还有NewInlineType,我在其中看到了合同表的所有字段,但在合同的任何地方都看不到:
class NewInlineType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('foo', 'bar', array(
'label' => false,
'class' => 'MyBundle:MyClass',
))
->add('format', FormatType::class, array(
'label' => false,
))
->add('version', VersionType::class, array(
'label' => false,
))
->add('debut', 'datePicker', array(
'label' => false,
'placeholder' => 'Début'
))
->add('fin', 'datePicker', array(
'label' => false,
'placeholder' => 'Fin'
));
}
public function getName()
{
return 'contractNew';
}
public function getParent()
{
return 'contractEdit';
}
}
谢谢
【问题讨论】:
-
它应该是
MyBundle:MyClass但你应该将它替换为你的实体 fcn,比如 `App\Entities\Contract` -
父表单类型(它的方法
getName()返回'contractEdit')应该有一个public function configureOptions()来设置默认的data_class选项值,或者它有一个父表单。 -
我不确定这是否可能,但也许 data_class 是在 src/AppBundle/Resources/config/services.yml 中配置的
-
你确定实际的 NewInlineType 有 add('foo', 'bar', array( 吗?使用 bar 作为类型没有意义。我猜你的 data_class 是在 'bar' 中定义的类型。
-
@ArleighHix 我很确定你明白了,设置
Contract类的configureOptions()在Contract/EditType.php类中!!非常感谢 :) 你想发表一个回答以便我接受吗?
标签: forms symfony doctrine symfony-2.8