如何用CakePHP 3.4输出自定义HTTP正文内容?回显导致“无法发出头”错误

qyzbxkaa  于 2022-11-11  发布在  PHP
关注(0)|答案(2)|浏览(103)

使用CakePHP 3.4、PHP 7.0.
我正在尝试做一个非常简单的控制器方法来输出一些JSON。它输出“不能修改头..."。

public function test() {
    $this->autoRender = false;
    echo json_encode(['method' => __METHOD__, 'class' => get_called_class()]);
}

浏览器输出

{"method":"App\\Controller\\SomeController::test", "class":"App\\Controller\\SomeController"}

Warning (512): Unable to emit headers. Headers sent in file=...
Warning (2): Cannot modify header information - headers already sent by (output started at ...)
Warning (2): Cannot modify header information - headers already sent by (output started at ...)

我完全理解PHP为什么抱怨这一点。问题是CakePHP为什么抱怨,我能做些什么呢?
需要注意的是,CakePHP 2.x允许这样做。

toe95027

toe950271#

控制器不应该回显数据!回显数据可能会导致各种问题,从测试环境中无法识别数据,到无法发送头,甚至数据被切断。
这样做在CakePHP 2.x中已经是错误的了,尽管它在某些情况下,甚至在大多数情况下可能是有效的。随着新HTTP堆栈的引入,CakePHP现在在回显响应之前显式地检查发送的头,并相应地触发错误。
发送自定义输出的正确方法是配置并返回响应对象,或者使用序列化视图,在Python 3.x中也是如此。
引用文档:
控制器动作通常使用Controller::set()来创建一个上下文,View使用它来呈现视图层。由于CakePHP使用的约定,您不需要手动创建和呈现视图。相反,一旦控制器动作完成,CakePHP将处理呈现和交付视图。
如果出于某种原因,您希望跳过默认行为,则可以从带有完全创建的响应的操作返回Cake\Network\Response对象。

**从3.4版开始,将为\Cake\Http\Response *
操作手册〉控制器〉控制器操作

配置响应

使用PSR-7兼容接口

$content = json_encode(['method' => __METHOD__, 'class' => get_called_class()]);

$this->response = $this->response->withStringBody($content);
$this->response = $this->response->withType('json');
// ...

return $this->response;

PSR-7兼容的接口使用了不可变的方法,因此使用了withStringBody()withType()的返回值。在CakePHP〈3.4.3中,withStringBody()是不可用的,你可以直接写入body流,这不会改变响应对象的状态:

$this->response->getBody()->write($content);

使用过时的接口

$content = json_encode(['method' => __METHOD__, 'class' => get_called_class()]);

$this->response->body($content);
$this->response->type('json');
// ...

return $this->response;

使用序列化视图

$content = ['method' => __METHOD__, 'class' => get_called_class()];

$this->set('content', $content);
$this->set('_serialize', 'content');

这还需要使用请求处理程序组件,并启用扩展解析和使用附加了.json的相应URL,或者发送带有application/json接受头的正确请求。

另请参阅

*操作手册〉控制器〉控制器操作
*Cookbook〉请求和响应对象〉设置正文



bjg7j2ky

bjg7j2ky2#

CakePHP 3有一个名为JSON views的东西,它允许你返回JSON数据。我以前没有做过任何CakePHP,所以我不知道一个请求的生命周期,但它值得研究。

相关问题