Laravel:我应该在循环中使用@include吗?

时间:2017-08-25 10:47:36

标签: laravel laravel-5 blade

下面我提供了一个循环显示产品卡的例子。第一个似乎对我来说更方便,但我担心性能因为循环中的@include。由于这项任务很常见,我想选择最好的方法。

案例1.使用@include:

search.blade.php

QComboBox

_item.blade.php

<div id='search-results'>   
    @foreach($items as $item)
         @include('items._item')
    @endforeach
</div>

案例2.没有@include:

search.blade.php

<div>
    <div class='item-title'>{{$item->title}}</div>
    <div class='item-description'>{{$item->description}}</div>
</div>

_items_list.blade.php

<div id='search-results'>
    @include('items._items_list')
</div>

3 个答案:

答案 0 :(得分:0)

这可能会产生巨大的性能问题。当您像第一种情况一样循环@include时,生成的原始php文件确实将包含的视图作为函数调用。这会降低页面渲染速度。

第二种情况更具性能,因为它基本上是1包含(带有包含html片段的循环)。

我现在正遇到这个问题。我有一个数据表循环250条记录,但每条记录包含5个帮助程序。在我的情况下,这些帮助程序非常重要并且包含一些必要的(简单)逻辑,但即使使用简单的逻辑,1250子视图也会导致大量性能下降,将页面的加载时间减少到5-6秒,而复制时为300-400毫秒这个助手代码。

我正在努力编写一个Laravel扩展来解析所有@include并将其替换为实际代码,但这不是一件容易的事......

这对于生产环境来说是非常值得的优化。我希望Laravel已经为此创建了一个解决方案。

答案 1 :(得分:0)

我通过使用传递给某个刀片的75行然后对该75行进行两次迭代来测试了此行为。 第一个仅在此刀片文件中使用刀片代码,另一个被调用@include另一个具有相同代码的刀片文件,并在每次刺激的开始和结束时使用microtime(true)php函数标记时间 使用@include的情况下,时间增加了3倍。

答案 2 :(得分:-1)

第一种方式似乎是最正确的方法。