使用伏模板"查看简单"内部用户组件

时间:2014-09-10 06:10:17

标签: dependency-injection phalcon

我有一个关于在用户组件中使用伏特模板引擎的问题,并且只需简单的视图。

我为用户组件编写了一个类(从Phalcon \ Mvc \ User \ Component扩展它)。它有一种渲染简单视图的方法:

public function renderPath()
{
    $view = $this->getDi()->getView();

    $simpleView = new \Phalcon\Mvc\View\Simple;
    $simpleView->setViewsDir($view->getViewsDir().'components/');

    $render = $simpleView->render($this->key.'/path');

    return $render;
}

因此,我获取当前视图组件以获取它的viewsDir并将其用作简单视图的路径。

这个初始化工作正常,但只提供渲染phtml文件,而我希望能够呈现“* .volt”。

如果我为volt-template($simpleView->registerEngines(['.volt' => 'volt']);)注册引擎,那么我得到一个Phalcon \ Mvc \ View \ Exception“获取应用程序服务需要依赖注入器容器”。

但是,如果通过运行$simpleView->setDi($this->getDi());使用setDI更改视图的DI,我既不会得到异常,也不会输出($ render === null)。但是在缓存目录中,我可以看到伏特模板被编译。

要注册组件,请使用以下代码:

    $di->set('catalogComponent', function () {
        $component = new \ABLib\Components\CatalogComponent;
        $component->setCatalogProvider();

        return $component;
    }, true);

并呈现视图:{{ this.catalogComponent.renderPath() }}

所以,问题是我做错了什么?如何在组件内部使用伏模板引擎?

更新

管理来解决这个问题。不幸的是,我不知道为什么会这样。所以,在我的应用程序中,我使用这样的代码:

$simpleView = new \Phalcon\Mvc\View\Simple;
$simpleView->setDI($this->getDI());
$simpleView->registerEngines(array(
    '.volt' => function ($view, $di) {
        $volt = new VoltEngine($view, $di);
        $volt->setOptions(array(
            'compiledPath' => BASE_PATH.'/cache/',
            'prefix' => 'volt_',
        ));

        return $volt;
    }
));

然后调用$simpleView->render()来呈现视图。 我无法理解的事情 - 当我添加带有服务的模板引擎时,为什么它不起作用。但是,当我添加一个新定义时,一切都开始工作。

1 个答案:

答案 0 :(得分:1)

在尝试将伏特渲染引擎附加到简单视图时遇到了同样的问题。当我尝试重用之前在我的依赖注入服务中注册的伏特实例时,我得到了奇怪的结果。我认为这是因为当你实例化伏特引擎时,你需要传入一个视图。发动机必须与伏特发动机最初关联的视图紧密耦合。因此,使用常规Phalcon \ Mvc \ View视图获得的Phalcon \ Mvc \ View \ Simple视图不会得到相同的结果。我通过声明一个额外的伏特服务克服了这个问题,我打算在渲染简单视图时使用它。我使用标准视图的第一个伏特服务和简单​​视图的第二个伏特服务:

// setup 'volt' engine
$di->set('volt', function($view, $di) use ($config) {
    $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
    $volt->setOptions(
        array(
            'compiledPath'      => CACHE_PATH . '/views/',
            'compiledExtension' => '.compiled',
            'compiledSeparator' => '%%',
            'compileAlways'     => true, // performance decrease
            'stat'              => true,
        )
    );
    return $volt;
}, true);

// setup 'simple_volt' engine for simple rendering
$di->set('simple_volt', function($simple_view, $di) use ($config) {
    $volt = new \Phalcon\Mvc\View\Engine\Volt($simple_view, $di);
    $volt->setOptions(
        array(
            'compiledPath'      => CACHE_PATH . '/views/',
            'compiledExtension' => '.compiled',
            'compiledSeparator' => '%%',
            'compileAlways'     => true, // performance decrease
            'stat'              => true,
        )
    );
    return $volt;
}, true);

虽然上面的两个服务是相同的,但是视图类型的依赖注入似乎会对渲染引擎的行为产生影响。当我需要渲染一个简单的视图并将输出保存到变量时,我确保将其注册到我的简单版本的伏特渲染引擎:

// create a simple view to help render sections of the page
$simple_view = new \Phalcon\Mvc\View\Simple();
$simple_view->setViewsDir( __DIR__ . '/../views/' );
$simple_view->setDI( $this->di );
$simple_view->registerEngines(array(
    ".volt"  => 'simple_volt'
));

// use the simple view to generate some html
$data_object = $my_data_model->getData();
$data_html = $simple_view->render('index/dataview',array('data_object'=>$data_object));

// pass the rendered simple view as a variable into the regular view
$this->view->setVar('data_html',$data_html);