我正在使用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).
答案 0 :(得分:0)
正如评论中所提到的,控制器操作不应该回显数据,即使它可能在某些情况下工作,甚至可能在大多数情况下工作。输出数据的正确方法是使用(数据)视图,配置并返回响应对象,甚至返回一个字符串(但不能与CakePHP的未来版本向前兼容)。
回显数据可能会导致各种问题,从无法在测试环境中识别的数据到无法发送的标头,甚至数据被切断,这正是您所遇到的问题。例如,当Content-Length
标题中发送的大小与正在发送的数据的实际大小不匹配时,后者可能会发生,这通常发生在内容被压缩的情况下。
如果您遇到gzip响应问题的长度不匹配问题,那么您必须弄清楚涉及压缩的位置(在服务器级别(例如mod_deflate
),在PHP扩展级别上(对于示例zlib
),在PHP代码级别(例如CakeResponse::compress()
)),以及为什么它没有相应地设置适当的长度。
话虽如此,只需将所需数据传递给视图,然后从那里构建并回显响应数据。鉴于您不想回复HTML,您可能还需要相应地设置响应类型:
public function checkout()
{
$this->response->type('text'); // = text/plain
// ...
$this->set(compact(array('priceCTP', 'ref', 'act', 'par')));
}
如上所述,另一种选择是返回一个正确的响应对象:
public function checkout()
{
$this->response->type('text');
// ...
$body = "Reference=" . $ref . "&Action=" . $act . "&Reponse=";
switch ($act) {
case "DETAIL":
$body .= $priceCTP;
break;
case "ERREUR":
case "ACCORD":
case "REFUS":
case "ANNULATION":
$body .= "OK";
break;
// ...
}
// ...
$this->response->body($body);
return $this->response;
}
PS。你真的想用法语的钥匙回答吗? Reponse
也许应该是Response
。
PPS。如果您使用查询字符串进行响应,则可能需要/需要对值进行相应的URL编码。
另见