我想更改RESTful api中的默认标头集合。我可以在我发送的每个响应中使用set()方法更改标头,但我不想写
$response = Yii::$app->response;
$response->headers->set('X-Powered-By','My server <devel>')
$response->setStatusCode(somecode);
$response->data = somedata;
return $response;
这非常麻烦,我的控制器操作长度增长,因为我必须回应每个错误的请求和错误。 我试图更改rest / config / main.php中的响应组件,但我禁止更改headers属性,因为它是只读的。
请帮忙。
答案 0 :(得分:4)
您不需要去扩展响应类。您可以通过配置应用程序的<objects>
<object>
<TestString1>abc</TestString1>
<TestString2>abc</TestString2>
</object>
<object>
<TestString1><&> Russian: "???? ? ??????"</TestString1>
<TestString2><&> Russian: "слов в тексте"</TestString2>
</object>
</objects>
组件并在response
事件中添加自定义标头来执行此操作,例如:
beforeSend
这将为所有回复添加标题。如果您想为每个控制器执行此操作,可以在控制器的return [
...
'components' => [
...
'response' => [
'on beforeSend' => function($event) {
$event->sender->headers->add('X-Frame-Options', 'DENY');
},
],
...
],
];
方法中使用\Yii::$app->response->headers->add($name, $value);
。
答案 1 :(得分:0)
正如M Sost指出的那样,我为我找到了正确的道路。我扩展了yii \ web \ Response类以包含我的标题。
namespace common\components;
use yii\web\Response;
class MyResponse extends Response
{
public $server = 'Project <devel.local>';
public function init()
{
parent::init();
$this->headers->set('X-Powered-By',$this->server);
}
}
应该使用.php exension将组件保存在命名空间中(如果这不明显)。
这样我就可以将自己的类添加到rest \ config \ main.php响应组件中,并在config中设置$ server属性值。
....
'response' => [
'class' => 'common\components\MyResponse',
'format' => yii\web\Response::FORMAT_JSON,
'charset' => 'UTF-8',
'server' => 'Project <devel.world>', // This line can be added to change
// the X-Powered-By header value
],
],
....