2013-01-23 60 views
2

我想了解Zend应用程序的工作流程。为了测试我定义:Zend Framework输出渲染顺序

控制器 - IndexController.php:

public function preDispatch() { 
     error_log('IndexController::preDispatch'); 
     echo 'IndexController::preDispatch <br />'; } 

public function init() {  
     error_log('IndexController::init'); 
     echo 'IndexController::init <br />'; } 

public function indexAction() {   
     error_log('IndexController::indexAction'); 
     echo 'IndexController::indexAction <br />'; } 

查看脚本 - index.phtml:

<?php 
    echo'index view script - echo'; 
    $this->title = "ZF Tutorial"; 
    $this->headTitle($this->title); ?> 
<h3>index view script - content</h3> 

布局脚本 - layout.phtml

... 
<body> 
    <div id="content"> 
    <?php 
    error_log('Layout1'); 
    echo $this->layout()->content ?> 
     <h1> 
      <?php 
      error_log('Layout2'); 
      echo $this->escape($this->title); ?>    
     </h1> 
    </div> 
</body> 
... 

这是我的困惑。 error_log输出的顺序与我在浏览器中的顺序不同。

error_log中输出(预期的顺序):

  • 的IndexController ::初始化
  • 的IndexController :: preDispatch
  • 的IndexController ::的indexAction
  • 布局1
  • 布局2

浏览器输出:

  • 的IndexController ::初始化
  • 索引视图脚本 - 回声
  • 索引视图脚本 - 内容
  • 的IndexController :: preDispatch
  • 的IndexController ::的indexAction
  • ZF教程

为什么控制器中的输出在视图脚本之后呈现?是否preDispatch & indexAction缓存以某种方式先输出视图脚本内容?

+1

如果你正在回应你不应该的东西,那么你正在搞乱这个框架。 init或preDispatch不应该回显任何内容。框架使用缓冲区来防止人们做这些愚蠢的东西,在php中检查ob_start(),ob_get_clean()方法 – mpm

回答

2

是的,在调度过程中的任何输出都被输出缓冲区捕获并附加到响应中。这可能看起来很混乱,但你不应该直接在控制器中输出东西(但是如果你确实想要看到它)。你的error_log列表显示了这些事情被执行的顺序,这些都是真正重要的。