Symfony 2.3 使用 handleRequest 验证表单非常慢
Posted
技术标签:
【中文标题】Symfony 2.3 使用 handleRequest 验证表单非常慢【英文标题】:Symfony 2.3 validating form with handleRequest is insanely slow 【发布时间】:2014-04-17 04:32:50 【问题描述】:我正在提交一个包含很多字段的表单,并尝试使用 handleRequest($request)
对其进行验证,如 Symfony 文档中所示。
我的实体很大,与其他实体有很多关系。
handleRequest($request)
正在验证每个提交的表单字段并检查错误。
发现的问题是在提交我的主要实体的相关实体的 id 时(例如办公室的人),handleRequest
将在内部获取相关实体的所有对象(相关实体的完整表,所有人)并将他们作为物体补水。
我认为它应该只检查提交的 id 是否存在于另一个表中,获取该相关实体对象并检查它是否有错误(而不是获取所有相关表)。
如果你检查和调试 Symfony2 handleRequest
的源代码,你很容易在这行发现同样的问题:
Form/Form.php
// Normalize data to unified representation
$normData = $this->viewToNorm($viewData);
$value = $transformers[$i]->reverseTransform($value);
如何在不处理这个问题的情况下仍然验证表单,这使得使用handleRequest($request)
验证表单变得异常缓慢?
如果我不使用 handleRequest 来验证它,它会自动将每个字段的错误添加到我的表单中,我如何手动验证每个字段,然后将每个字段的错误添加到我的表单中,并在下一个中显示查看?
【问题讨论】:
你能提供更多关于你是如何解决这个问题的吗?我的 $form->handleRequest($request) 处理时间超过 30 秒。我认为这与我实体的一个属性与另一个实体相关联有关。我实体的子道具是一个实体(不同类)。无论 symfony 做什么来将这些实体映射在一起,都需要太长的时间。 无论是在主窗体中还是在所有相关实体的窗体中,您都必须始终为所有字段指定变量类型。 ***.com/questions/7913086/…虽然很慢,但是你也可以调试handleRequest,检查它检查所有字段的循环,当它找到一个实体时,它会检查该实体的所有字段进入另一个循环,等等。跨度> 【参考方案1】:这个问题有点模糊,答案很大程度上取决于你的具体形式。请发布给您带来最困难的表单定义。
检查以确保您没有EAGER在此处获取关联。
handleRequest()
将获取请求对象并构建您的表单描述的模型,就像您的表单定义的那样。
如果需要对象以便在初始表单上向用户显示数据,或在提交时验证数据,“entity”字段类型将获取您告诉的所有对象它在其定义中。例如,如果您要显示一个大的选择列表,则需要所有这些数据。
我过去也遇到过类似的问题,这是因为我使用了很多选择字段,这些字段被用作一系列多选复选框。我的瓶颈实际上在树枝层,同时渲染出我作为单独实体存储的数千个复选框。
我从一组复选框切换到一个多选框,它显着提高了我的速度。
【讨论】:
很抱歉,我缺乏信息和太多答案,我现在不在电脑前,但我会在几个小时内更新我的问题的全部细节,我想你可能会发现并解决它,但是生病测试并报告它 回答这么多,你是对的。为了避免handleRequest查找所有相关实体并提高速度,必须在表单类型中指定实体类型。稍后我会用一个例子更新帖子。以上是关于Symfony 2.3 使用 handleRequest 验证表单非常慢的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 2.3 - 使用带有 LESS 的 Twitter Bootstrap 3,通过 composer setup 作为供应商安装,无法访问 Glyphicons 字体
Symfony 2.3 Bad Credentials 自定义提供程序
symfony 2.3 在 __construct 函数中调用非对象的成员函数 get()