2013-03-27 66 views
1

我会尽可能地将其解释清楚。我正在研究一个相当大的项目,并创建了一个CrudController。此控制器有一些默认操作(indexAction,createAction,archiveAction ...)。我也创建了一些相应的视图。渲染循环中的项目,在CRUD视图中的选项

  • 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()函数或使用不同的东西。

我不是在寻找预建的代码或任何东西,而是建议在哪个方向继续。感谢您的时间。

+0

我记得ZF1有一个类似的问题:如果我没有记错的话,使用partials引用大量使用过的内存作为视图的新实例。你可以使用块结构吗:定义一个默认的动作块并覆盖它的项目实体? – herrjeh42 2013-03-27 10:21:46

+0

这是我确实在考虑的一件事,但是,这意味着创建一个新的视图来扩展crud列表视图。这是免费的一点麻烦,但可能是最好的解决方案。 – Bram 2013-03-27 10:32:33

+0

嗯,看看这个问题,它是我猜,“渲染”产生一个新的请求:http://stackoverflow.com/questions/9077097/twig-render-vs-include - 我将它添加为作为进一步参考的答案。 – herrjeh42 2013-03-27 10:36:28

回答

0

正如Stackoverflow post中所述,“渲染”会产生新的请求并因此增加内存使用量。尝试使用代替默认动作块的块结构。覆盖项目实体的这个。