-
-
Notifications
You must be signed in to change notification settings - Fork 40
高级使用
LianBo edited this page May 3, 2022
·
4 revisions
若 Client 未提供你需要的识别方法,你可以通过如下方式进行扩展:
$this->application->aliyun->extend('aaa', function (AliyunRequest $request, $a, $b) {
return new Response(200, [], $a.$b);
});
$response = $this->application->aliyun->aaa('a', 'b');
var_dump((string) $response->getBody()); // ab
extend 的第一个参数为一个 string 类型的方法名称,第二个参数为一个闭包; 其中闭包的第一个参数固定为当前 client 注入的 request。闭包的返回格式我们没有校验,你可以返回任意类型的数据结构。
$this->application->aliyun->extend('aaa', function (AliyunRequest $request, $a, $b) {
return $a+$b;
});
$response = $this->application->aliyun->aaa(1, 2);
var_dump($response); // 3
调用 application 的方法 extend 来自定义 client,自定义的 client 必须实现 Godruoyi\OCR\Contracts\Client
接口。
$this->application->extend('huawei', function ($container) {
return $container->make(HuaweiClient::class);
});
// Godruoyi\OCR\Support\Response
$response = $this->application->huawei->idcard();
我们推荐你使用
$container->make
来初始化对象,这将会自动注入你所依赖的参数。
use Godruoyi\OCR\Support\Response;
use Godruoyi\OCR\Contracts\Client;
class HuaweiClient implements Client
{
public function idcard($url, $images, array $options = [])
{
// 做你自己的业务逻辑
return $this->request($url, $images, $options);
}
/**
* {@inheritdoc}
*/
public function request($url, $images, array $options = []): Response
{
$psrResponse = (new \GuzzleHttp\Client)->post();
return Response::createFromGuzzleHttpResponse($psrResponse);
}
}
你也可以直接继承 Godruoyi\OCR\Clients\Client
对象,这将额外提供方法扩展的功能。
下面我们使用推荐的做法来完善 HuaweiClient 对象
use Godruoyi\OCR\Clients\Client;
class HuaweiClient extends Client
{
public function __construct(HuiweiRequest $request)
{
$this->request = $request;
}
public function idcard($url, $images, array $options = [])
{
// 做你自己的业务逻辑
return $this->request($url, $images, $options);
}
}
其中 HuiweiRequest 继承自 Godruoyi\OCR\Requests\Request
,他将自动为你注入所需参数。
use Godruoyi\OCR\Requests\Request;
use Godruoyi\OCR\Support\Response;
class HuiweiRequest extends Request
{
/**
* {@inheritdoc}
*/
public function send($url, $images, array $options = []): Response
{
return $this->http->post($url, $this->processRequestParamters($images, $options));
}
// 根据图片/参数封装 http 请求参数
public function processRequestParamters($images, array $options = [])
{
return [];
}
}
若你的服务商接口涉及身份认证,你还可以自定义 http 中间件来生成请求签名,如下:
class BaiduRequest extends Request
{
/**
* {@inheritdoc}
*/
protected function middlewares(): array
{
return [
'baidu' => $this->requestMiddleware(),
];
}
protected function requestMiddleware()
{
return function (callable $handler) {
return function (RequestInterface $request, array $options) use ($handler) {
$httpMethod = $request->getMethod();
$path = $request->getUri()->getPath();
$host = current($request->getHeader('Host'));
$authorization = $this->signer->sign($httpMethod, $path, compact('host'));
$request = $request->withHeader('Authorization', $authorization);
return $handler($request, $options);
};
};
}
}