实现自定义 Response 类。以修改响应头 Server 字段默认为 nginx 来举例。
想设置 http 响应头 Server 字段默认值为 nginx,故我作了以下修改:
<?php
//省略版权信息,见谅。
namespace support;
/**
* Class Response
* @package support
*/
class Response extends \Webman\Http\Response
{
public function __construct(
$status = 200,
$headers = array(),
$body = ''
) {
$this->_status = $status;
$this->_header = $headers;
$this->_body = $body;
//伪装 nginx 服务器
if(!isset($this->_header['Server'])){
$this->_header['Server'] = 'nginx';
}
}
}
<?php
//省略版权信息,见谅
namespace Webman\Exception;
use Throwable;
use Webman\Http\Request;
// use Webman\Http\Response;
use support\Response;
interface ExceptionHandlerInterface
{
//省略代码...
}
<?php
//省略版权信息,见谅
namespace Webman\Exception;
use Throwable;
use Psr\Log\LoggerInterface;
use Webman\Http\Request;
// use Webman\Http\Response;
use support\Response;
/**
* Class Handler
* @package support\exception
*/
class ExceptionHandler implements ExceptionHandlerInterface
{
//省略代码...
}
<?php
//省略版权信息,见谅
namespace Webman;
use Webman\Http\Request;
// use Webman\Http\Response;
use support\Response;
interface MiddlewareInterface
{
//省略代码...
}
<?php
//省略版权信息,见谅
namespace Webman;
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
use Webman\Http\Request;
// use Webman\Http\Response;
use support\Response;
use Webman\Route\Route as RouteObject;
use Webman\Exception\ExceptionHandlerInterface;
use Webman\Exception\ExceptionHandler;
use Webman\Config;
use FastRoute\Dispatcher;
use Psr\Container\ContainerInterface;
use Monolog\Logger;
/**
* Class App
* @package Webman
*/
class App
{
//省略代码...
}
以上改法测试可用,但显然不是“正常”做法
虽然以上能达到效果,但是不可能期望每次 composer install 之后都要改 vendor 内的源码。
我该如何正常实现自定义 Response 类?
直接改support/Response.php就行了
只修改 support/Response.php 能够覆盖绝大多数的情况。
但存在以下情况,返回的是 Webman\Http\Response 类:
这几种情况,support/Response.php 内的修改是不生效的。
1,修改start.php use support\App;
2, class App extends \Webman\App
然后
protected static function send(TcpConnection $connection, $response, Request $request)
{
if ($response instanceof \Workerman\Protocols\Http\Response) {
$response->header('Server', 'Tomcat');
}
parent::send($connection, $response, $request);
}
谢谢!
继承出来,覆盖。
可以这样实现
十分感谢!