我在 Laravel 5 中创建了一个 View 编辑器。当我使用通配符 * 向我的所有 View 添加内容时,它至少被调用两次。它在加载我的主模板时运行,并在包含我的内容页面时再次运行。这将在未来带来问题,因为它会多次执行它执行的查询。我能够通过将其存储在静态变量中来修复多重查询:
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);
}
}
我的问题是,有没有办法确保它只运行一次,无论我加载了多少 View ,或者是否有其他解决方案?我现在修复它的方式对我来说并不合适。谢谢!
最佳答案
很遗憾,由于 View Composer 的实现方式,无法让它运行一次。 Illuminate\View\View::renderContents()
方法负责调用绑定(bind)到 View 的 composer,并且由于任何形式的 View 渲染(Blade 模板继承或简单的 @include
语句)都会执行该方法,这意味着当渲染任何 View 时,任何 composer绑定(bind)到它会被触发。
由于在您的情况下您使用 *
通配符来绑定(bind)所有 View ,如果您的页面呈现十个 View ,则 Composer 将执行十次。但是,您的方法看起来是解决此缺点的好方法。
关于php - 查看composer运行多次,如何减少到1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30673749/