优化 Laravel 中视图编辑器的行为


Optimize the behavior of view composers in Laravel?

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

例如,我有一个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()都会返回相同的只解决一次的结果