优化Laravel中视图作曲家的行为?

时间:2016-01-20 13:57:36

标签: php laravel optimization

我已经设置了一些视图编辑器,以便为每个请求将一般数据传递到主布局,但是我注意到这可能是一个性能缺陷。

E.g。我有一个CharityComposer,在__construct()方法中设置受保护的属性$charities,其结果为Charity::all()。每个Charity模型都有一个自定义属性totalAmountUnpaidDonations,只需将$charity->donations[$index]->amount的属性Donation设置为paid的所有0进行计算}。

totalAmountUnpaidDonations大于0时,我想在主布局中使用通知引起对这一事实的注意。

但是当我在我的CharityComposer中var_dump变量时,我发现它变为var_dumped 6次。这6次中的4次来自Blade模板中的部分包含,而另外2次是(我认为)主控布局和控制器实际返回给定路径的视图。

有没有办法防止这种情况,并且每个请求都有一个视图编辑器运行一次?就像一种RequestComposer,但我不认为这些存在于Laravel的上下文中。或者我应该以不同的方式设置它?

2 个答案:

答案 0 :(得分:1)

每次渲染视图时,实例化一个composer类的事实并不是你可以解决的问题,如果你有资源或耗时的逻辑,那么由于多次执行会加起来。至于使用视图作曲家课程,我没有看到任何快速解决问题的方法。

但是有一种方法可以通过设置composer来使用闭包而不是类来轻松解决这个问题,然后将逻辑移到作曲家之外并只将结果传递给闭包,所以唯一的声明就是在渲染视图之前执行,是将变量赋值给视图。

所以你可以拥有这个:

// Query the database for the information once
$data = Charity::all();

// Pass the information to the composer closure using the `use` construct
view()->composer(['all', 'your', 'views'], function ($view) use ($data) {
    // This still gets executed 6 times, but that's not a problem anymore
    $view->with('data', $data);
});

答案 1 :(得分:0)

更好的选择是改为使用单例/自动外观类。 说明:您可以使用一个只解析一次的类(也可以在类的构造函数中添加“设置”逻辑)。 然后,每次您要使用它时,\Facades\YourClass::yourGetterFunction()都将返回始终相同的仅解析一次的结果