视图作曲家多次运行,如何减少到1

Dav*_*son 8 php laravel

我在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);
}

} 
Run Code Online (Sandbox Code Playgroud)

我的问题是,有没有办法确保它只运行一次,无论我加载了多少视图,还是有另一种解决方案?我现在修理它的方式对我来说并不合适.谢谢!

Bog*_*dan 5

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

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