我有一个自定义FormType,当父表单持续存在时,需要将其自身添加到父实体.
在Symfony <2.3中,可以通过执行以下操作来完成:
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'
);
}
}
Run Code Online (Sandbox Code Playgroud)
但升级到Symfony 2.6之后,我发现$builder->getParent()已经删除了.但现在我无法听取提交的父母的意见.
所以我将监听器添加到我的构建器并从订阅服务器中引用了父级.但这并没有真正起作用,因为我检查父表单是否有效 - 它不是,因为它还没有提交:
function postSubmit(FormEvent $e)
{
if ($e->getForm()->getParent()->getRoot()->isValid()) {
//this gives 'false'
Run Code Online (Sandbox Code Playgroud)
这个错误是由下一段代码引起的:
// Symfony\Component\Form\Form.php @ line 744
public function isValid()
{
if (!$this->submitted) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
并且因为父表单首先遍历所有子节点并提交,所以在设置之前$this->submitted = true...我不确定父节点是否有效.
TL; DR
如何将Eventlistener添加到我的父表单,而无需调整我的父表单?我希望我的FooType能够添加到所有表单中,而不必知道/记住为特定的FooType做一些逻辑.