在CRUD视图中渲染循环中项目的选项

时间:2013-03-27 10:08:05

标签: php symfony twig

我会尽可能清楚地解释这一点。我正在开发一个相当大的项目,并创建了一个CrudController。此控制器具有一些默认操作(indexActioncreateActionarchiveAction ...)。我也创建了一些相应的观点。

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

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

但是,我已经到了我需要一些实体(项目)需要一些额外操作(在编辑和存档旁边),即“渲染”或“下载”(渲染完成时)。 因为我不想完全覆盖这个实体的列表视图只是为了添加额外的操作,因为我将再次遇到这个场景,我决定尝试将动作的渲染移出列表视图:我创建了一个只显示操作的actions.html.twig视图和一个基于给定项目状态添加其他操作的actionsAction(如果它显示渲染按钮或下载按钮?)。 / p>

在我使用的list.html.twig中:

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

然而,事实证明渲染完全是内存耗尽,只要我在列表中显示一些实体,就会导致“内存耗尽”错误。之前仅使用12MB的页面突然使用超过128MB(内存限制),这是完全不可接受的。加载时间也大量增加

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

  • 为什么render()函数会出现这样的内存和性能?如果我可以减少,问题就会解决。
  • 是否有办法模仿render()函数或使用不同的东西。

我不是在寻找预建代码或其他任何东西,而是寻找继续进行的建议。感谢您的时间。

1 个答案:

答案 0 :(得分:0)

如此Stackoverflow post中所述,“渲染”会产生新请求并因此增加内存使用量。尝试使用块结构,而不是定义默认动作块。为项目实体覆盖此内容。