【发布时间】:2015-03-10 05:56:04
【问题描述】:
我有一个自定义的FormType,当父Form持续存在时,需要将自己添加到父Entity中。
在 Symfony
class FooType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
...
$builder->getParent()->addEventSubscriber(new FooSubscriber)
}
}
class FooSubscriber implements EventSubscriberInterface
{
static function getSubscribedEvents()
{
return array(
FormEvents::POST_SUBMIT => 'postSubmit'
);
}
}
但在升级到 Symfony 2.6 后,我发现 $builder->getParent() 已被删除。但是现在我不能听父母提交了。
所以我将侦听器添加到我的构建器并从订阅者中引用父级。但这并没有真正起作用,因为我检查了父表单是否有效 - 它不是,因为它还没有提交:
function postSubmit(FormEvent $e)
{
if ($e->getForm()->getParent()->getRoot()->isValid()) {
//this gives 'false'
这个false是下一段代码造成的:
// Symfony\Component\Form\Form.php @ line 744
public function isValid()
{
if (!$this->submitted) {
return false;
}
而且由于父表单首先循环遍历所有子表单并提交,然后在自身上设置$this->submitted = true...我不确定父表单是否有效。
TL;DR
如何在我的父表单中添加事件监听器,而无需调整我的父表单?我希望我的 FooType 可以添加到所有表单中,而不必知道/记住为特定的 FooType 做一些逻辑。
【问题讨论】:
-
如您所说,getParent 在 2.3 中已被删除。你能更详细地描述用例吗?可能是更好的解决方案。
-
这是一个可以添加到另一个实体的实体。在这种情况下,它是一个 MenuItem,它是在持久化 Page 时创建的。这个 MenuItem 基于页面的标题,因此它需要它的父级进行输入。但我不希望页面“知道”有一个依赖于他的 MenuItem。所以在此之前,我只需向 PageAdmin 添加一个 MenuItem 即可。现在我必须在管理员中添加一个订阅者 - 这感觉脏
-
遇到同样的问题,我想知道 Root 表单是否有效,我在 2.6 中找不到方法 :(