2013-01-23 59 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列表顯示了這些事情被執行的順序,這些都是真正重要的。