我已经设置了一些视图编辑器,以便为每个请求将一般数据传递到主布局,但是我注意到这可能是一个性能缺陷。
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的上下文中。或者我应该以不同的方式设置它?
答案 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()
都将返回始终相同的仅解析一次的结果