【问题标题】:Optimize the behavior of view composers in Laravel?优化 Laravel 中视图作曲家的行为?
【发布时间】:2016-04-26 09:59:57
【问题描述】:

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

例如我有一个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 次(我认为)用于主布局和控制器实际为给定路由返回的视图。

有没有办法防止这种情况并让视图编写器在每个请求中运行一次?就像一种 RequestComposer,但我不相信这些存在于 Laravel 的上下文中。还是我应该以不同的方式进行设置?

【问题讨论】:

    标签: php laravel optimization


    【解决方案1】:

    更好的选择是使用单例/自动外观类。 说明:您可以使用一个只会被解析一次的类(并且可能在类的构造函数中添加您的“设置”逻辑)。 然后,每次你想使用它\Facades\YourClass::yourGetterFunction() 将返回总是相同的只解决一次的结果

    【讨论】:

      【解决方案2】:

      每次渲染视图时都会实例化作曲家类这一事实是您无法解决的,如果您有耗费资源或时间的逻辑,那么由于多次执行,这将加起来。至于使用视图作曲家类,我没有看到任何快速解决问题的方法。

      但是有一种方法可以轻松解决这个问题,方法是将作曲家设置为使用闭包而不是类,然后将逻辑移到作曲家之外,只将结果传递给闭包,所以剩下的唯一语句是在视图呈现之前执行,是将变量分配给视图。

      所以你可以有这个:

      // 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。祝你有美好的一天。
      猜你喜欢
      • 1970-01-01
      • 2014-12-01
      • 2015-06-14
      • 2017-05-09
      • 2018-09-28
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多