Skip to content

高级使用

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

自定义 Client

调用 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);
            };
        };
    }
}
Clone this wiki locally