siganushka / api-factory
API Factory.
1.0.0
2025-05-13 01:21 UTC
Requires
- php: >=7.4
- symfony/http-client: ^5.4|^6.0|^7.0
- symfony/options-resolver: ^5.4|^6.0|^7.0
README
An API Factory Abstraction Layer.
Installation
$ composer require siganushka/api-factory
Usage
An API class needs to implement 3 methods:
// Configure the options required for the request AbstractRequest::configureOptions(OptionsResolver $resolver): void; // Configure the request with resolved options AbstractRequest::configureRequest(RequestOptions $request, array $options): void; // Parse the response data (ParseResponseException when there is an error) AbstractRequest::parseResponse(ResponseInterface $response): mixed;
Example:
Github get a user: https://docs.github.com/cn/rest/users/users#get-a-user
namespace App\Request; use Siganushka\ApiFactory\AbstractRequest; use Siganushka\ApiFactory\RequestOptions; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Contracts\HttpClient\ResponseInterface; /** * @extends AbstractRequest<array> */ class GithubUsers extends AbstractRequest { protected function configureOptions(OptionsResolver $resolver): void { $resolve ->define('username') ->required() ->allowedTypes('string') ; } protected function configureRequest(RequestOptions $request, array $options): void { $request ->setMethod('GET') ->setUrl(sprintf('https://api.github.com/users/%s', $options['username'])) ; } protected function parseResponse(ResponseInterface $response): array { return $response->toArray(); } } $request = new GithubUsers(); $result = $request->send(); // throws MissingOptionsException: The required options "username" are missing. $result = $request->send(['username' => 'siganushka']); // { // "login": "siganushka", // "id": 45844370, // "node_id": "MDQ6VXNlcjQ1ODQ0Mzcw", // "avatar_url": "https://avatars.githubusercontent.com/u/45844370?v=4", // "gravatar_id": "", // "url": "https://api.github.com/users/siganushka", // "html_url": "https://github.com/siganushka", // "followers_url": "https://api.github.com/users/siganushka/followers", // "following_url": "https://api.github.com/users/siganushka/following{/other_user}", // "gists_url": "https://api.github.com/users/siganushka/gists{/gist_id}", // ... // }