2

我正在尝试了解 Zend 应用程序的工作流程。对于我定义的测试:

控制器 - 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 输出(预期顺序):

  • 索引控制器::init
  • IndexController::preDispatch
  • IndexController::indexAction
  • 布局1
  • 布局2

浏览器输出:

  • 索引控制器::init
  • 索引视图脚本 - echo
  • 索引视图脚本 - 内容
  • IndexController::preDispatch
  • IndexController::indexAction
  • 采埃孚教程

为什么控制器中的输出在视图脚本之后呈现?来自 preDispatch 和 indexAction 的回显结果是否以某种方式缓冲以首先输出视图脚本内容?

4

1 回答 1

2

是的,调度过程中的任何输出都由输出缓冲区捕获并附加到响应中。这可能看起来令人困惑,但您不应该直接在控制器中输出内容(但如果您这样做了,您仍然希望看到它)。您的 error_log 列表显示了这些事情的执行顺序,这才是真正重要的。

于 2013-01-24T01:38:01.810 回答