Phalcon View 多个渲染级别之间的关系

Phalcon 有多种渲染级别,他们的嵌套关系,简单来说就是这张图:

我们必须在外层视图文件中调用 getContent(); ?>的方法,使他们能够嵌套起来。如果是 volt 引擎的话,可以使用 {{ content() }},它经过 volt 编译后和前面的方法是一样的。

那为什么使用 getContent() 方法呢,我们先看一下源码中它的作用是什么

/**
 * Externally sets the view content
 *
 *
 *    $this->view->setContent("

hello

"); *
*/ public function setContent(string content) -> { let this->_content = content; return this; } /** * Returns cached output from another view stage */ public function getContent() -> string { return this->_content; }

而 $this->_content 是在什么时候被赋值的,我们需要了解 Phalcon 整个 view 层的渲染原理和过程:http://segmentfault.com/a/1190000004358686

我们可以通过$this->view->setRenderLevel(View::LEVEL_MAIN_LAYOUT);的方法选择渲染级别。

类常量 解释 顺 序
LEVEL_NO_RENDER 表明要避免产生任何形式的显示
LEVEL_ACTION_VIEW 生成显示到视图关联的动作 1
LEVEL_BEFORE_TEMPLATE 生成显示到控制器模板布局之前 2
LEVEL_LAYOUT 生成显示到控制器布局 3
LEVEL_AFTER_TEMPLATE 生成显示到控制器模板布局后 4
LEVEL_MAIN_LAYOUT 生成显示到主布局 5

我们可以在 controller 的 initialize() 方法中,使用下面的方法来指定 Level_After_Template 和 Level_Before_Template 对应的文件。

$this->view->setTemplateBefore('before');
$this->view->setTemplateAfter('after');

以渲染 testController helloAction 为例,它们的目录结构应该是这样

其中,views 根目录下的 index.phtml 是主布局文件。

layouts 文件夹下的三个文件分别对应,Level_After_Template、Level_Before_Template、Level_Layout。

test 文件夹是对应 testController 下每一个 action 的视图,hello 就是 testController 下 helloAction 对应的视图。

Level_Main_Layout 默认是 index.phtml 或 index.volt,后缀取决去你的模板渲染引擎,而且这个文件必须是视图文件夹的根目录下。我们可以可以通过 setMainView() 的方法指定为 views 根目录下的其他文件。

下面是有关的部分源码。

protected _mainView = "index";

/**
 * Sets default view name. 
 * Must be a file without extension in the views directory
 *
 * 
 *     //Renders as main view views-dir/base.phtml
 *     $this->view->setMainView('base');
 * 
 */
public function setMainView(string viewPath) -> 
{
    let this->_mainView = viewPath;
    return this;
}

/**
 * Returns the name of the main view
 */
public function getMainView() -> string
{
    return this->_mainView;
}
  • 关于 view 的渲染原理和过程,参考我的另一篇博文:http://segmentfault.com/a/1190000004358686

  • 更多细节参考官网文档:https://docs.phalconphp.com/zh/latest/reference/views.html

你可能感兴趣的:(view,phalcon)