【问题标题】:Using volt-template with "view simple" inside user component在用户组件内使用带有“简单视图”的 volt-template
【发布时间】: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


【解决方案1】:

我在尝试将 volt 渲染引擎附加到简单视图时遇到了同样的问题。当我尝试重用之前在依赖注入服务中注册的 volt 实例时,我得到了奇怪的结果。我认为这是因为当您实例化 volt 引擎时,您需要传入一个视图。引擎必须与伏特引擎最初关联的视图紧密耦合。因此,使用 Phalcon\Mvc\View\Simple 视图获得的结果与使用常规 Phalcon\Mvc\View 视图获得的结果不同。我通过声明一个额外的 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 2012-09-21
    • 2020-12-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多