Php Symfony 2.8至3.4:实体ID的简单数组未保存
我正在将一个应用程序从Symfony 2.8更新到3.4 我曾经存储发送AJAX请求的实体集合(不使用Twig的form_xxx helpers) 这是典型的有效载荷:Php Symfony 2.8至3.4:实体ID的简单数组未保存,php,symfony,symfony-forms,Php,Symfony,Symfony Forms,我正在将一个应用程序从Symfony 2.8更新到3.4 我曾经存储发送AJAX请求的实体集合(不使用Twig的form_xxx helpers) 这是典型的有效载荷: my_healthbundle_anamnesistype[habits][]: 5 my_healthbundle_anamnesistype[diseases][]: 9 my_healthbundle_anamnesistype[diseases][]: 10 它们在AnamnesType表单生成器上没有特殊处理,没有C
my_healthbundle_anamnesistype[habits][]: 5
my_healthbundle_anamnesistype[diseases][]: 9
my_healthbundle_anamnesistype[diseases][]: 10
它们在AnamnesType表单生成器上没有特殊处理,没有ChoiceType或EntityType,只是:
$builder->add('habits')
->add('allergies')
->add('interventions')
->add('diseases')
所有这些实体都非常简单,只有一个ID和一个名称字段
其中每一项都映射到一个记忆实体中,如下所示:
/**
* @ORM\ManyToMany(targetEntity="Habits")
*/
protected $habits;
控制器代码为:
$editForm = $this->createForm(new AnamnesisType(), $entity);
$request = $this->getRequest();
$editForm->bind($request);
if ($editForm->isValid()) {
/// WIN!
所有这些在2.8中都起到了很好的作用。正如你所看到的,这是非常简单和直接的。表单生成器没有引用任何实体类、选项类型、实体类型,什么都没有。通过发送所提到的有效负载并调用bind()替换了“记忆”中的所有“习惯”
更新不推荐的内容并遵循所有建议后(getRequest()
成为对request\u堆栈的调用,bind()
成为handleRequest()
),创建表单从“newanamnesistype
”更改为“AnamnesisType::class
”,等等),isValid()
方法返回false,调用$editForm->getErrors(true,false)时得到一个空字符串。
我在这里漏了一步吗?当实体更改时,请求中的集合是否保存到表单中?非常感谢您的帮助,这是最后一个升级到3.4然后再升级到4.0的阻止程序。看起来您缺少if条件中的$editForm->isSubmitted()
调用。我希望您的更新代码如下所示:
$editForm = $this->createForm(new AnamnesisType(), $entity);
$request = $this->getRequest();
$editForm->handleRequest($request);
if ($editForm->isSubmitted() && $editForm->isValid()) {
...
}
不建议在没有isSubmitted的情况下调用isValid,但它仍然适用于Symfony<4.0Thanks!注意,但我使用的是3.4和$editForm->isValid()
是false
,因此即使使用isSubmitted
,它也永远不会进入if条件。我刚刚尝试从handleRequest($request)
切换到submit($request)
,通过使用submit
我至少收到一条错误消息:“错误:此值无效”。但我仍然不知道“错误”是什么。你使用WebProfiler工具栏吗?如果是,您可以查看验证失败的原因,例如转到http://localhost:8000/_profiler
(如果使用内部Web服务器默认设置),则转到验证选项卡。日志中有任何消息吗?将代码放在现在这样会更清楚。最重要的是要知道问题来自何处,以及它在更新的代码中。