我已经设置了一些视图编辑器,以便将每个请求的一般数据传递给主布局,但我已经注意到这可能是一个性能缺陷。
例如,我有一个CharityComposer
,它在其__construct()
方法中设置了一个受保护的属性,$charities
的结果是Charity::all()
。每个Charity
模型都有一个自定义属性totalAmountUnpaidDonations
这是从所有$charity->donations[$index]->amount
计算的简单方法,其中Donation
的属性paid
设置为0
。
当totalAmountUnpaidDonations
大于 0 时,我想在我的主布局中使用通知来提请注意这一事实。
但是当我var_dump CharityComposer
变量时,我看到它var_dumped 6 次。 这 6 次中有 4 次来自 Blade 模板中的部分包含,另外 2 次(我认为)用于主布局和控制器实际返回给定路由的视图。
有没有办法防止这种情况并让视图编辑器为每个请求运行一次?就像一种请求作曲家,但我不相信这些存在于 Laravel 的上下文中。还是我应该以不同的方式进行设置?
每次呈现视图时都会实例化作曲家类这一事实不是您可以绕过的,如果您的逻辑是资源或耗时的,那么由于多次执行,这将加起来。就使用视图作曲家类而言,我没有看到任何解决此问题的快速方法。
但是,有一种方法可以轻松解决此问题,方法是将编辑器设置为使用闭包而不是类,然后将逻辑移动到编辑器之外,并且仅将结果传递给闭包,因此在呈现视图之前唯一要执行的语句是将变量分配给视图的语句。
所以你可以有这个:
// 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);
});
更好的选择是改用单例/自动外观类。说明:您可以使用一个只解析一次的类(并且可以在类的构造函数中添加"设置"逻辑)。然后,每次你想使用它时'Facades'YourClass::yourGetterFunction()
都会返回相同的只解决一次的结果