【问题标题】:Laravel 4 view composer with "singleton"带有“单例”的 Laravel 4 视图作曲家
【发布时间】:2014-07-07 21:38:25
【问题描述】:

我正在使用视图编辑器来创建我网站的导航结构。导航中的一些链接是动态的,需要几个数据库查询。一切都很好,但是,如果我使用加载在同一页面上的多个视图注册视图编辑器(例如:主导航视图和辅助侧边栏视图),这些数据库查询将执行多次。这是因为 Laravel 每次创建一个视图时都会实例化我的 Navigation 类,这是预期的行为。

但是,我想消除这些重复的查询。我的第一个想法是实现某种单例模式,但这不会起作用,因为 Laravel 的视图作曲家是如何工作的。有什么方法可以在这里模仿单例模式吗?或者也许是消除这些重复数据库查询的更好方法(忽略 HTML/文件缓存)?

下面是我为喜欢视觉的人所做的事情的简要介绍:

查看 Composer 注册:

View::composer(array('layouts.nav', 'layouts.sidebar'), '\Namespace\ViewComposers\Navigation');

/Namespace/ViewComposers/Navigation.php:

public function compose(View $view)
{
    $navigation = array();
    ...
    // Some code that requires DB queries
    ... 
    $view->navigation = $navigation;
}

/views/layouts/nav.blade.php:

@foreach($navigation as $nav)
    ...
@endforeach

/views/layouts/sidebar.blade.php:

@foreach($navigation as $nav)
    ...
@endforeach

【问题讨论】:

标签: php laravel-4


【解决方案1】:

有很多方法可以做到这一点,但一种方法是将作曲家注册为具有 IoC 容器的单例。这是因为视图作曲家是从 IoC 容器中解析出来的。

App::singleton('MyProject\MyComposer');

namespace MyProject;

class MyComposer
{
    protected $navigation;

    public function compose($view)
    {
        $view->navigation = $this->getNavigation();
    }

    public function getNavigation()
    {
        if ($this->navigation !== null) {
            return $this->navigation;
        }

        $results = ...;

        return $this->navigation = $results;
    }
}

我不会在这里概述的其他解决方案是改为依赖注入将结果缓存在内存中的存储库/服务,并将查询构建器的 remember() 方法与数组缓存驱动程序一起使用。

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 2013-06-01
    • 2014-05-07
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2013-07-10
    相关资源
    最近更新 更多