【发布时间】:2014-11-03 16:32:50
【问题描述】:
我有一个关于在用户组件和简单视图中使用 volt-template 引擎的问题。
我为用户组件编写了一个类(从 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)。但在缓存目录中,我可以看到 volt-template 已编译。
要注册组件,我使用以下代码:
$di->set('catalogComponent', function () {
$component = new \ABLib\Components\CatalogComponent;
$component->setCatalogProvider();
return $component;
}, true);
并渲染视图:{{ this.catalogComponent.renderPath() }}
所以,问题是我做错了什么?如何在我的组件中使用 volt-template 引擎?
更新:
设法解决了这个问题。不幸的是,我不知道它为什么起作用。所以,在我的应用程序中,我使用这样的代码:
$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() 渲染视图。
我无法理解的事情 - 为什么当我添加带有服务的模板引擎时它不起作用。但是,当我添加新定义时,一切都会开始工作。
【问题讨论】:
-
我没有读完,但我认为最后应该是:
{{ catalogComponent.renderPath() }}(没有this) - 即使用标准电压/视图设置时。 -
是的,没错。删除它。
标签: dependency-injection phalcon