我有一个使用Luracast Restler API在PHP中实现的REST Web服务。
如果我在公开公共 API 方法的自定义类或实现执行身份验证的 iAuthenticate 方法的类中的文档注释中添加任何@class
标记,则 restler 无法解析请求(如果错误报告为 ON)。
我认为问题是 DocParser 类试图处理 @class
标签,就好像 php Class
声明一样。类formatClass()
的方法生成undefined index
通知。如果错误报告为 ON,这将发送标头,因此当以后 Restler 尝试发送响应时,它将无法更改标头以指示已发送 JSON 内容并触发Cannot modify header information - headers already sent
。
是否有任何解决方法,或者只是 Restler API 中的一个错误?(除了设置我的错误报告级别以避免发送通知)。
更新:它在 Restler 2.1.5 中已修复
这是由DocParser引起的Restler 2.1.4中存在的错误,因为它希望@class
特定格式的评论,如下所示
/**
* @class ClassName(property=value&property2=value2)
*/
它用于在初始化后设置另一个类的属性。 例如,我们可以用它来告诉 XmlFormat 设置根名称,定义应该转换为属性的内容等, 让我们以已知的 BMI 为例,添加 PHPDoc 注释,如下所示,
<?php
class BMI {
/**
* @class XmlFormat(root_name=self&attribute_names=height,weight)
*/
function index($height=162.6, $weight=84) {
$result = new stdClass();
$cm = $height;
$kg = $weight;
$meter = $cm / 100;
$inches = $meter * 39.3700787;
$feet = round($inches/12);
$inches = $inches % 12;
$result->bmi = round($kg/($meter*$meter),2);
$lb = round($kg/0.45359237,2);
if($result->bmi<18.5){
$result->message = 'Underweight';
}elseif ($result->bmi<=24.9){
$result->message = 'Normal weight';
}elseif ($result->bmi<=29.9){
$result->message = 'Overweight';
}else{
$result->message = 'Obesity';
}
$result->metric = array('height'=>"$cm centimeter", 'weight'=>"$weight kilograms");
$result->imperial = array('height'=>"$feet feet $inches inches", 'weight'=>"$lb pounds");
return $result;
}
}
返回以下 XML
<?xml version="1.0"?>
<self>
<bmi>31.77</bmi>
<message>Obesity</message>
<metric height="162.6 centimeter" weight="84 kilograms"/>
<imperial height="5 feet 4 inches" weight="185.19 pounds"/>
</self>
否则将是
<?xml version="1.0"?>
<response>
<bmi>31.77</bmi>
<message>Obesity</message>
<metric>
<height>162.6 centimeter</height>
<weight>84 kilograms</weight>
</metric>
<imperial>
<height>5 feet 4 inches</height>
<weight>185.19 pounds</weight>
</imperial>
</response>
更多用例和解释可以在这里找到
当以意外格式定义@class
时,它不应引发错误。我们将在下一个版本中修复它。