我正在使用cakePHP 2.x.我正在尝试使用空布局渲染视图 . 视图应仅包含从操作控制器返回的字符串,不包含html代码 . 这是代码:
public function checkout(){
$ref =null;$act=null;$par=null;
$this->layout = false;
//$this->render(false);
//$priceCTP = $this->Session->read('priceCTP');;
$priceCTP = $this->getPrice();
//var_dump(session_save_path());
if (isset($this->params['url']['Reference'])) {
$ref = $this->params['url']['Reference'];
}
if (isset($this->params['url']['Action'])) {
$act = $this->params['url']['Action'];
}
if (isset($this->params['url']['Param'])) {
$par = $this->params['url']['Param'];//$_GET['Param'];//this->request->params['named']
}
switch ($act) {
case "DETAIL":// accéder à la base et récuperer le montant
echo "Reference=".$ref."&Action=".$act."&Reponse=".$priceCTP;
break;
case "ERREUR": // accéder à la base et mettre à jour l’état de la transaction
echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
break;
case "ACCORD": // accéder à la base, enregistrer le numéro d’autorisation (dans param)
echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
break;
case "REFUS": // accéder à la base et mettre à jour l’état de la transaction
echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
break;
case "ANNULATION": // accéder à la base et mettre à jour l’état de la transaction
echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
break;
}
}
这个网址的结果(http://mydomain/orders/checkout?
Reference=123&Action=DETAIL&Param=)
"Reference=123&Action=DETAIL&Repon"
rather than
"Reference=123&Action=DETAIL&Reponse=121,630" (works fine on localhost).
1 回答
不要回显控制器的数据
正如评论中所提到的,控制器操作不应该回显数据,即使它可能在某些情况下工作,甚至可能在大多数情况下工作 . 输出数据的正确方法是使用(数据)视图,配置并返回响应对象,甚至返回一个字符串(但不能与CakePHP的未来版本向前兼容) .
回显数据可能会导致各种问题,从未在测试环境中识别的数据到无法发送的标头,甚至数据被切断,这正是您所遇到的问题 . 后者可以例如在
Content-Length
标头中发送的大小与正在发送的数据的实际大小不匹配时发生,这通常发生在内容被gzip压缩的情况下 .内容 - 长度不匹配可能是原因
如果你遇到了gzipped响应问题的长度不匹配问题,那么你必须在PHP代码级别(在PHP扩展级别(例如
zlib
)上找出涉及压缩的位置(在服务器级别(例如mod_deflate
))(例如CakeResponse::compress()
)),以及为什么它没有相应地设置适当的长度 .正确的控制器动作逻辑
话虽如此,只需将所需数据传递给视图,然后从那里构建并回显响应数据 . 鉴于您不想使用HTML进行响应,您可能还需要相应地设置响应类型:
如上所述,另一种选择是返回一个正确的响应对象:
PS . 你真的想用法语的钥匙回复吗?
Reponse
也许应该是Response
.PPS . 鉴于您使用查询字符串进行响应,您可能需要/需要对值进行相应的URL编码 .
也可以看看
Cookbook > Controllers > Controller actions
Cookbook > Controllers > Request > Request and Response objects > CakeResponse > Dealing with content types