关于Yaf响应输出的总结

本文深入探讨了Yaf响应输出机制,包括自动渲染、返回响应、立即输出响应正文等功能,详细解析了Yaf Dispatcher类及Controller类的相关属性与方法,帮助开发者更好地理解并运用Yaf进行高效响应处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

估计这块疑团是不少的,尤其是不看源码的同学(这里介绍并引用源码,Yaf-2.2.9)。

Yaf响应输出响应相关的属性

Yaf\Dispatcher类的属性

1._auto_render

作用:自动渲染功能开关,默认1。自动渲染是指根据当前请求的控制器Controller和动作Action自动寻找模块文件,加载与渲染模块,之后返回结果或者输出。

PHP代码设置:

Yaf\Dispatcher::getInstance()->autoRender($flag);
      Yaf\Dispatcher::getInstance()->disableView();
      Yaf\Dispatcher::getInstance()->enableView();

源码yaf_dispatcher.c,735-773行

2._return_response

if (auto_render) {
     ret = NULL;
     if (!Z_BVAL_P(instantly_flush)) {
          zend_call_method_with_1_params(&executor, ce, NULL, "render", &ret, action);
          zval_ptr_dtor(&executor);


          if (!ret) {
               zval_ptr_dtor(&action);
               return 0;
          } else if (IS_BOOL == Z_TYPE_P(ret) && !Z_BVAL_P(ret)) {
               zval_ptr_dtor(&ret);
               zval_ptr_dtor(&action);
               return 0;
          }


          if (Z_TYPE_P(ret) == IS_STRING && Z_STRLEN_P(ret)) {
               yaf_response_alter_body(response, NULL, 0, Z_STRVAL_P(ret), Z_STRLEN_P(ret), YAF_RESPONSE_APPEND  TSRMLS_CC);
          }


          zval_ptr_dtor(&ret);
     } else {
          zend_call_method_with_1_params(&executor, ce, NULL, "display", &ret, action);
          zval_ptr_dtor(&executor);


          if (!ret) {
               zval_ptr_dtor(&action);
               return 0;
          }


          if ((Z_TYPE_P(ret) == IS_BOOL && !Z_BVAL_P(ret))) {
               zval_ptr_dtor(&ret);
               zval_ptr_dtor(&action);
               return 0;
          }
          zval_ptr_dtor(&ret);
     }
} else {
     zval_ptr_dtor(&executor);
}

作用:返回包含请求正文的响应对象开关,默认为0。默认情况下,Yaf的自动渲染查找并渲染模板(render,并非display),渲染结果写入Yaf\Response_Abstract实例的_body属性,在分发器结束分发之后,输出_body(数组遍历输出)属性的值,并清空_body。设置此属性为1,分发器结束分发之后,不会输出和清空_body,可以通过Yaf\Application的run(),Yaf\Dispather的方法dispatch(),或者Yaf\Controller_Abstract的getResponse()等方法的调用返回响应对象。进而调用Yaf\Response_Abstract实例的getBody()方法获取响应正文。

PHP代码设置:

Yaf\Dispatcher::getInstance()->returnResponse($flag);

源码yaf_dispatcher.c,941-948行

return_response = zend_read_property(yaf_dispatcher_ce, dispatcher, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_RETURN), 1 TSRMLS_CC);

if (!Z_BVAL_P(return_response)) {
    (void)yaf_response_send(response TSRMLS_CC);
    yaf_response_clear_body(response, NULL, 0 TSRMLS_CC);
}

3._instantly_flush

作用:立即输出响应正文开头,默认为0。默认情况下,Yaf自动渲染调用Yaf\Controller_Abstract的render方法,渲染模板,当此属性设置为1时,Yaf调用Yaf\Contrller_Abstract的display方法,直接渲染并输出,但不设置Yaf\Response_Abstract实例的_body属性。

PHP代码设置:

          Yaf\Dispatcher::getInstance()->flushInstantly($flag);

注意:_auto_render设置为0时,_return_response和_instantly_flush的设置将无效。

Yaf\Controller_Abstract类的属性

yafAutoRender

作用:自动渲染功能开头,默认null。此属性的作用与Yaf\Dispather类的_auto_render作用相同,但是优先级更高。

PHP代码设置:

1 $this->yafAutoRender = true;

其中$this代表实现Yaf\Controller_Abstract的控制器类的当前实例。

Yaf响应输出响应相关的方法

1 Yaf\Controller_Abstract::display($template_file);

作用:渲染模板并输出结果

1 Yaf\Controller_Abstract::render($template_file);

作用:渲染模板,并返回结果

1 Yaf\Response_Abstract::setBody($content, $type);

作用:设置响应正文内容为$content,类型为$type;也即设置Yaf\Response_Abstract的_body属性键为$type对应的值为$content。注意如果已经存在则为追加模式。

1 Yaf\Response_Abstract::getBody($type 'content');

作用:获取$type对应的响应正文

1 Yaf\Response_Abstract::response();

作用:输出所有类型的响应正文

1 Yaf\Response_Abstract::clearBody($type);

作用:清空全部或者$type类型的响应正文

本文链接: http://www.phpboy.net/web/php/860.html  转载请注明出处.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值