1

我会尽量解释清楚。我正在做一个相当大的项目并创建了一个 CrudController。这个控制器有一些默认动作(indexAction, createAction, archiveAction...)。我还创建了一些相应的视图。

  • 视图将edit.html.twig使用 form_widget() 函数绘制表单
  • list.html.twig视图获取一个数据数组和一个(可配置的)列数组。这将绘制一个包含所需列一些操作按钮(默认为编辑和存档按钮)的简单表格。

这个想法是我现在能够快速开发我的应用程序:我创建了一个新的实体、存储库、FormType,最后是一个扩展 CrudController 而不是 BaseController 的控制器。在我的 EntityController 中,我确保我的 CrudController 的配置是正确的(实体名称、指向 FormType 的指针......)。这一切都像一个魅力。

但是,我已经到了需要一些额外操作(除了编辑和存档)的实体(项目)的地步,即“渲染”或“下载”(渲染完成时)。因为我不想为了添加额外的操作而完全覆盖这个实体的列表视图,并且我将再次遇到这种情况,所以我决定尝试将操作的呈现移出列表视图:根据给定项目的状态,我创建了一个actions.html.twig仅呈现操作的视图和一个actionsAction添加其他操作的视图(它应该显示渲染按钮还是下载按钮?)。

在我的list.html.twig我用过:

{% for row in data %}
    {{ render(controller(entityControllerActionsAction, {'id': row.id})) }}
    ...
{% endfor %}

然而,事实证明渲染是非常消耗内存的,一旦我在列表中显示一些实体,就会导致“内存耗尽”错误。以前只用了12MB的页面,现在突然用了128MB以上(内存限制),简直不能接受。加载时间也大幅增加

我正在寻找一个体面的、面向对象的、DRY解决方案来解决这个问题。

  • 为什么 render() 函数在这里会占用大量内存和性能?如果我能减少它,问题就解决了。
  • 有没有办法模仿 render() 函数或使用不同的东西。

我不是在寻找预构建的代码或任何东西,而是在寻找有关前进方向的建议。感谢您的时间。

4

1 回答 1

0

正如这篇Stackoverflow 帖子中提到的, “渲染”会产生一个新请求并因此增加内存使用量。尝试使用定义默认操作块的块结构。为项目实体覆盖此内容。

于 2013-03-27T10:38:22.427 回答