CakePHP 3.4.2 测试 POST 的响应总是返回 NULL
Posted
技术标签:
【中文标题】CakePHP 3.4.2 测试 POST 的响应总是返回 NULL【英文标题】:CakePHP 3.4.2 Testing POST's response always returning NULL 【发布时间】:2017-08-06 13:37:25 【问题描述】:我目前正在测试一个简单地按给定 id 搜索记录的应用程序。 它工作正常,但测试拒绝返回代码中的响应。奇怪的是它只显示在 CLI 中。
我使用的是 cakephp 提供的 phpunit:
"phpunit/phpunit": "^5.7|^6.0"
这里是冲突的代码:
$this->post('/comunas/findByBarrio',[
'barrio_id'=>1
]);
var_dump($this->_response->body());die(); //This is just a test which always returns NULL... while the CLI shows the actual response, which is a JSON.
在对任何其他操作执行 GET 或 POST 时也会出现同样的问题。 但这里是目标控制器的代码:
public function findByBarrio()
$this->autoRender = false;
if ($this->request->is('POST'))
$data = $this->request->getData();
if (!empty($data['barrio_id']))
$this->loadModel('Comuna');
$barrio_id = $data['barrio_id'];
$comuna = $this->Comuna->find('list',['conditions' => ['barrio_id'=>$barrio_id]])
->hydrate(false)
->toArray();
if ($comuna)
echo json_encode($comuna);
else
throw new NotFoundException('0');
//echo 0; //Comuna no encontrada para el barrio recibido
else
echo -1;
提前谢谢你!
更新 1:我只能通过在“$this->post”方法周围使用“ob_start()”和“ob_get_clean()”来获得输出。我希望有一种更清洁的方式......
更新 2:现在可以使用了!只需使用符合 PSR-7 的接口即可。谢谢! 这是更正后的控制器:
public function findByBarrio()
$this->autoRender = false;
$this->response = $this->response->withType('json'); //CORRECTION
if ($this->request->is('POST'))
$data = $this->request->getData();
if (!empty($data['barrio_id']))
$this->loadModel('Comuna');
$barrio_id = $data['barrio_id'];
$comuna = $this->Comuna->find('list',['conditions' => ['barrio_id'=>$barrio_id]])
->hydrate(false)
->toArray();
if ($comuna)
$json = json_encode($comuna);
$this->response->getBody()->write($json); //CORRECTION
else
//Comuna no encontrada para el barrio recibido
$this->response->getBody()->write(0); //CORRECTION
else
//No se recibió el barrio
$this->response->getBody()->write(-1); //CORRECTION
return $this->response; //CORRECTION
【问题讨论】:
控制器动作代码是什么样的? 任何动作都会发生这种情况,即使是最简单的动作。即便如此,我现在添加了该代码。谢谢 那么我假设你所有的控制器动作都编码不正确;) 【参考方案1】:控制器动作不应该回显数据,即使它可能在某些情况下工作,甚至可能在大多数情况下。输出非渲染视图模板的数据的正确方法是配置并返回响应对象,或者使用序列化视图。
测试环境依赖于正确执行此操作,因为它不会缓冲可能的输出,但会使用从控制器操作返回的实际值。
以下基本上是从https://***.com/a/42379581/1392379
引用自文档:
控制器动作通常使用
Controller::set()
来创建视图用来渲染视图层的上下文。由于 CakePHP 使用的约定,您不需要手动创建和呈现视图。相反,一旦控制器动作完成,CakePHP 将处理渲染和交付视图。如果出于某种原因您想跳过默认行为,您可以从带有完整创建响应的操作中返回
Cake\Network\Response
对象。
* 从 3.4 开始,这将是 \Cake\Http\Response
Cookbook > Controllers > Controller Actions
配置响应
使用符合 PSR-7 的接口
$content = json_encode($comuna);
$this->response->getBody()->write($content);
$this->response = $this->response->withType('json');
// ...
return $this->response;
符合 PSR-7 的接口使用不可变方法,因此使用了 withType()
的返回值。与设置标头和其他内容不同,通过写入现有流来更改正文不会更改响应对象的状态。
CakePHP 3.4.3 将添加一个不可变的 withStringBody
方法,该方法可用于替代写入现有流。
$this->response = $this->response->withStringBody($content);
使用已弃用的接口
$content = json_encode($comuna);
$this->response->body($content);
$this->response->type('json');
// ...
return $this->response;
使用序列化视图
$content = json_encode($comuna);
$this->set('content', $content);
$this->set('_serialize', 'content');
这还需要使用请求处理程序组件,并启用扩展解析和使用附加了 .json
的相应 URL,或者发送带有 application/json
接受标头的正确请求。
另见
Cookbook > Controllers > Controller Actions Cookbook > Views > JSON and XML views PHP FIG Standards > PSR-7 HTTP message interfaces【讨论】:
以上是关于CakePHP 3.4.2 测试 POST 的响应总是返回 NULL的主要内容,如果未能解决你的问题,请参考以下文章
cakePHP 使用 post 数据分页,无需会话、序列化或 post 来获取
将 Wordpress Post 与 Cakephp3 集成
CakePHP 3 AJAX POST 不允许并返回 403
php [cakephp:MediaController]用文件二进制文件返回cake的响应对象。 #cakephp