1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- <?php
- /*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
- namespace App\Libs\TikTok\Kernel\Traits;
- use App\Libs\TikTok\Kernel\Contracts\Arrayable;
- use App\Libs\TikTok\Kernel\Exceptions\HttpException;
- use App\Libs\TikTok\Kernel\Exceptions\InvalidArgumentException;
- use App\Libs\TikTok\Kernel\Exceptions\InvalidConfigException;
- use App\Libs\TikTok\Kernel\Http\Response;
- use App\Libs\TikTok\Kernel\Support\Collection;
- use Psr\Http\Message\ResponseInterface;
- /**
- * Trait ResponseCastable.
- *
- * @author overtrue <i@overtrue.me>
- */
- trait ResponseCastable {
- /**
- * @param ResponseInterface $response
- * @param string|null $type
- *
- * @return array|Collection|object|ResponseInterface|string
- * @throws InvalidConfigException|HttpException
- */
- protected function castResponseToType(ResponseInterface $response, string $type = null) {
- $response = Response::buildFromPsrResponse($response);
- $response->getBody()->rewind();
- switch ($type ?? 'array') {
- case 'collection':
- return $response->toCollection();
- case 'array':
- return $response->toArray();
- case 'object':
- return $response->toObject();
- case 'raw':
- return $response;
- default:
- if (!is_subclass_of($type, Arrayable::class)) {
- throw new InvalidConfigException(sprintf('Config key "response_type" classname must be an instanceof %s', Arrayable::class));
- }
- return new $type($response);
- }
- }
- /**
- * @param mixed $response
- * @param string|null $type
- *
- * @return array|Collection|object|ResponseInterface|string
- * @throws InvalidArgumentException
- * @throws InvalidConfigException|HttpException
- */
- protected function detectAndCastResponseToType($response, string $type = null) {
- switch (true) {
- case $response instanceof ResponseInterface:
- $response = Response::buildFromPsrResponse($response);
- break;
- case $response instanceof Arrayable:
- $response = new Response(200, [], json_encode($response->toArray()));
- break;
- case ($response instanceof Collection) || is_array($response) || is_object($response):
- $response = new Response(200, [], json_encode($response));
- break;
- case is_scalar($response):
- $response = new Response(200, [], (string)$response);
- break;
- default:
- throw new InvalidArgumentException(sprintf('Unsupported response type "%s"', gettype($response)));
- }
- return $this->castResponseToType($response, $type);
- }
- }
|