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

Php CRUD视图中循环中项目的渲染选项,php,symfony,twig,Php,Symfony,Twig,我将尽可能清楚地解释这一点。我正在从事一个相当大的项目,并创建了一个CrudController。此控制器有一些默认操作(indexAction,createAction,archiveAction…)。我还创建了一些相应的视图 edit.html.twig视图将使用form\u widget()函数绘制表单 list.html.twig视图获取一个数据数组和一个(可配置的)列数组。这将绘制一个简单的表,其中包含所需的列和一些操作按钮(默认情况下为编辑和归档按钮) 我现在可以快速开发我的应用

我将尽可能清楚地解释这一点。我正在从事一个相当大的项目,并创建了一个CrudController。此控制器有一些默认操作(
indexAction
createAction
archiveAction
…)。我还创建了一些相应的视图

  • edit.html.twig
    视图将使用form\u widget()函数绘制表单
  • list.html.twig
    视图获取一个数据数组和一个(可配置的)列数组。这将绘制一个简单的表,其中包含所需的列和一些操作按钮(默认情况下为编辑和归档按钮)
我现在可以快速开发我的应用程序了:我创建了一个新的实体、存储库、表单类型,最后是一个扩展CrudController而不是BaseController的控制器。在EntityController中,我确保CrudController的配置正确(实体名称、指向FormType的指针…)。这一切都很有魅力

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

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

{% for row in data %}
    {{ render(controller(entityControllerActionsAction, {'id': row.id})) }}
    ...
{% endfor %}
然而,事实证明render非常占用内存,当我在列表中显示一些实体时,它会导致“内存耗尽”错误。以前只使用12MB的页面现在突然使用了128MB(内存限制),这是完全不可接受的。加载时间也大幅增加

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

  • 为什么render()函数在这里会占用大量内存和性能?如果我能减少,问题就会解决
  • 有没有办法模仿render()函数或使用其他方法

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

如本“渲染”中所述,会产生新的请求,从而增加内存使用。请尝试与定义默认动作块的块结构一起使用。覆盖此项目实体。

我从ZF1中记得一个类似的问题:如果我没有记错的话,在创建视图的新实例时,使用分区会导致大量已用内存。你能不能改为使用块结构:定义一个默认的动作块,并为项目实体覆盖它?这是我确实在考虑的一件事,但是,这意味着创建一个扩展crud列表视图的新视图。这有点麻烦,但可能是最好的解决方案。啊,看看这个问题,我猜,“渲染”会产生一个新的请求:-我将添加它作为进一步参考的答案。