在Zend_View中禁用输出缓冲

时间:2011-01-26 02:31:29

标签: zend-framework zend-view

我在期待

class Default_Plugin_Test  extends Zend_Controller_Plugin_Abstract
{
  public function preDispatch($request)
  {
        Zend_Controller_Front::getInstance()->setParam('disableOutputBuffering', true);
  }
}

还会禁用与操作关联的视图中的缓冲,但事实并非如此。

即使看起来不可能在视图中禁用输出缓冲,因为它是硬编码的:


abstract class Zend_View_Abstract implements Zend_View_Interface
{
    /**
     * Processes a view script and returns the output.
     *
     * @param string $name The script name to process.
     * @return string The script output.
     */
    public function render($name)
    {
        // find the script file name using the parent private method
        $this->_file = $this->_script($name);
        unset($name); // remove $name from local scope

        ob_start();
        $this->_run($this->_file);

        return $this->_filter(ob_get_clean()); // filter output
    }
}

有没有人有类似的经历,或有解决方案?

2 个答案:

答案 0 :(得分:3)

有一件事,不要这样做

视图负责显示传递给它的内容。控制器/操作接收请求,它们确定需要完成的操作,写入数据库,从数据库获取等等。然后,它们将输出分配给视图,视图显示它。

如果你开始在视图之外显示你的页面部分,那么你打破MVC模型就是你应该使用Zend Framework的原因。

你的实际问题是什么?

修改

不要像这样运行CRON作业。将它们作为独立脚本运行,并实例化您的Zend框架和库以供CRON使用。 CRON不需要MVC模式来运行,使用电子邮件或其他东西来输出。您期望从CRON输出并使用该输出作为确定CRON是否成功的有意义方式的事实并不是使用CRON的正确方法。您应该记录输出以便稍后查看或通过电子邮件发送。

你可以实例化ZF而不是通过这样做来发送它

 $application->bootstrap();

而不是这个

 $application->bootstrap()->run();

答案 1 :(得分:1)

这适用于ZF的第1版。

根据this page,您必须在public / index.php中禁用输出缓冲(在引导调用之前和Zend_Application实例化之后):

我使用这样的东西:

$application = Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

if(APPLICATION_ENV !== 'production') {
    $frontController = Zend_Controller_Front::getInstance();
    $frontController->setParam('disableOutputBuffering', true);
}

$application->bootstrap()->run();

请注意,在application.ini中设置此选项不起作用。