【问题标题】:View composer runs multiple times, how to reduce to 1查看 composer 运行多次,如何减少到 1
【发布时间】:2015-08-20 19:55:28
【问题描述】:

我在 Laravel 5 中创建了一个视图作曲家。当我使用通配符 * 来为我的所有视图添加一些内容时,它至少会被调用两次。它在加载我的主模板时运行,并在包含我的内容页面时再次运行。这将在未来产生问题,因为它会执行多次执行的查询。我能够通过将多个查询存储在静态变量中来修复它:

class StoreComposer {


static $composed;


public function __construct(StoreRepository $repository)
{
    $this->store = $repository;
}


public function compose(View $view)
{

    if(static::$composed)
    {
        return $view->with('store', static::$composed);
    }


    static::$composed = $this->store->pushCriteria( new WithCategories() )
        ->pushCriteria( new WithSettings() )
        ->applyCriteria()
        ->all();

    $view->with('store', static::$composed);
}

} 

我的问题是,有没有办法确保它只运行一次,无论我加载多少视图,还是有其他解决方案?我现在修复它的方式对我来说感觉不对。谢谢!

【问题讨论】:

  • 你有没有找到解决这个问题的新方法?我刚刚遇到了这个问题,并意识到我的一些页面正在执行多次查询,因为我在每个页面上都使用了如此多的视图。
  • 我还没有找到任何新的解决方案。我建议为您的 viewcomposer 类创建一个基类,用于处理静态变量中的存储。
  • 感谢您的回复。我实际上重构了很多查询,使其更加明确并在控制器中运行。 View Composers 对我来说总是觉得有点太神奇
  • 如果你不需要所有页面上的查询结果,确实有点矫枉过正;)。很高兴您找到了适合您的解决方案。

标签: php laravel


【解决方案1】:

很遗憾,由于 View Composer 的实现方式,没有办法让它运行一次。 Illuminate\View\View::renderContents() 方法负责调用绑定到视图的作曲家,并且由于任何形式的视图渲染(刀片模板继承或简单的@include 语句)都会执行该方法,这意味着当任何视图被渲染时,任何作曲家都绑定到它被触发了。

由于您使用* 通配符绑定所有视图,因此如果您的页面呈现十个视图,则作曲家将被执行十次。但是,您的方法看起来是解决这个缺点的好方法。

【讨论】:

    【解决方案2】:

    您可以在此处使用配置来解决多次查询运行问题,例如显示以下代码。

    公共函数撰写(查看$view) {

    if(!Config::has('composeVars')) 
    {
        Config::set('composeVars') = [
          'data' => User::all();  
        ];
    }
    
    $view->with('*', Config::get('composeVars'));
    

    }

    【讨论】:

      【解决方案3】:

      试试这个单例解决方案或使用缓存https://laracasts.com/discuss/channels/laravel/executing-a-view-composer-only-once

      在 Laravel 5.6.38 上运行良好

      【讨论】:

        猜你喜欢
        • 2022-12-06
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 2011-10-12
        • 2015-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多