Dependency injection 使用带有“V”的电压模板;“简单视图”;内部用户组件

Dependency injection 使用带有“V”的电压模板;“简单视图”;内部用户组件,dependency-injection,phalcon,Dependency Injection,Phalcon,我有一个关于在用户组件和简单视图中使用volt模板引擎的问题 我为用户组件编写了一个类(扩展形式为Phalcon\Mvc\user\component)。它具有渲染简单视图的方法: 公共函数renderPath() { $view=$this->getDi()->getView(); $simpleView=new\Phalcon\Mvc\View\Simple; $simpleView->setViewsDir($view->getViewsDir().'components/'); $ren

我有一个关于在用户组件和简单视图中使用volt模板引擎的问题

我为用户组件编写了一个类(扩展形式为Phalcon\Mvc\user\component)。它具有渲染简单视图的方法:

公共函数renderPath()
{
$view=$this->getDi()->getView();
$simpleView=new\Phalcon\Mvc\View\Simple;
$simpleView->setViewsDir($view->getViewsDir().'components/');
$render=$simpleView->render($this->key./path');
返回$render;
}
所以,我获取一个当前视图组件来获取它的viewsDir,并将其用作简单视图的路径

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

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

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

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

$di->set('catalogComponent',函数(){
$component=new\ABLib\Components\catalogponent;
$component->setCatalogProvider();
返回$component;
},对);
要呈现视图:
{{this.catalogComponent.renderPath()}}

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

已更新

他设法解决了这个问题。不幸的是,我不知道它为什么有效。因此,在我的应用程序中,我使用如下代码:

$simpleView=new\Phalcon\Mvc\View\Simple;
$simpleView->setDI($this->getDI());
$simpleView->registerEngines(阵列(
“.volt”=>函数($view,$di){
$volt=新的VoltEngine($view,$di);
$volt->setOptions(阵列)(
“compiledPath'=>基本路径。”/cache/”,
'前缀'=>'电压',
));
返回$volt;
}
));
然后调用
$simpleView->render()
来渲染视图。
我不明白的是,当我在服务中添加模板引擎时,为什么它不起作用。但是,当我添加一个新的定义时,一切都开始工作。

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

// 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);
尽管上面的两个服务是相同的,但是视图类型的依赖项注入似乎对渲染引擎的行为产生了影响。当我需要渲染简单视图并将输出保存到变量时,请确保将其注册到我的简单版本的volt渲染引擎:

// 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);

我没有全部阅读,但我认为最后一个应该是:
{{{catalogComponent.renderPath()}}
(没有
这个
)-这是在使用标准volt/view设置时。是的,没错。移除它。