我有一个关于在用户组件中使用伏特模板引擎的问题,并且只需简单的视图。
我为用户组件编写了一个类(从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()
来呈现视图。
我无法理解的事情 - 当我添加带有服务的模板引擎时,为什么它不起作用。但是,当我添加一个新定义时,一切都开始工作。
答案 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);