Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
4 / 4 |
CRAP | |
100.00% |
35 / 35 |
| RequestBuilder | |
100.00% |
1 / 1 |
|
100.00% |
4 / 4 |
13 | |
100.00% |
35 / 35 |
| __construct | |
100.00% |
1 / 1 |
3 | |
100.00% |
13 / 13 |
|||
| createRequest | |
100.00% |
1 / 1 |
6 | |
100.00% |
17 / 17 |
|||
| getBaseUrl | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getHeaders | |
100.00% |
1 / 1 |
3 | |
100.00% |
4 / 4 |
|||
| <?php | |
| namespace FrontBundle\Services\Http; | |
| use GuzzleHttp\Psr7\Request; | |
| use Psr\Http\Message\RequestInterface; | |
| use Symfony\Component\Routing\Exception\InvalidParameterException; | |
| use Symfony\Component\Routing\Exception\MissingMandatoryParametersException; | |
| use Symfony\Component\Routing\Exception\RouteNotFoundException; | |
| /** | |
| * Class RequestBuilder. | |
| * | |
| * @author Théo FIDRY <theo.fidry@gmail.com> | |
| */ | |
| class RequestBuilder | |
| { | |
| /** | |
| * @var UrlBuilder | |
| */ | |
| private $urlBuilder; | |
| /** | |
| * @var string | |
| */ | |
| private $baseUrl; | |
| /** | |
| * @param UrlBuilder $urlBuilder | |
| * @param string $baseUrl | |
| * | |
| * @throws \InvalidArgumentException | |
| */ | |
| public function __construct(UrlBuilder $urlBuilder, $baseUrl) | |
| { | |
| $this->urlBuilder = $urlBuilder; | |
| $lastCharacter = strlen($baseUrl) - 1; | |
| if ('/' === $baseUrl[$lastCharacter]) { | |
| $baseUrl = substr($baseUrl, 0, $lastCharacter); | |
| } | |
| if ('http' !== substr($baseUrl, 0, 4)) { | |
| throw new \InvalidArgumentException( | |
| sprintf( | |
| 'Expected base URL to implement HTTP protocol. Should start with "http://" or "https://". Got "%s"' | |
| .'instead.', | |
| $baseUrl | |
| ) | |
| ); | |
| } | |
| $this->baseUrl = $baseUrl; | |
| } | |
| /** | |
| * Creates and return a new request object. All get, head, etc. methods are generated via this method. | |
| * | |
| * @example | |
| * If URL is empty, only the base URL will be used: | |
| * ::createRequest('GET') | |
| * => http://localhost | |
| * | |
| * If URI is used, add the base URL to generate the proper URL to request | |
| * ::createRequest('GET', '/api/users') | |
| * => http://localhost/api/users | |
| * | |
| * If route name is used, will first generate the URI before applying the base URL; can use parameters | |
| * ::createRequest('GET', 'users_cget') | |
| * => http://localhost/api/users | |
| * | |
| * ::createRequest('GET', 'users_get', null, ['parameters' => ['id' => 14]]) | |
| * => http://localhost/api/users/14 | |
| * | |
| * Can also apply other options | |
| * ::createRequest('GET', null, null, ['query' => ['id' => 14, 'filter' => ['order' => ['startAt' => 'desc']]]) | |
| * => http://localhost/api?id=14&filter[where][name]=john | |
| * | |
| * Or if you have just one query | |
| * ::createRequest('GET', null, null, ['query' => 'filter[where][name]=john') | |
| * => http://localhost/api?filter[where][name]=john | |
| * | |
| * @param string $method HTTP method. | |
| * @param string|null $url URL, URL, URI or route name. | |
| * @param string|null $token API token. | |
| * @param array $options Array of request options to apply. can have the keys: | |
| * - headers: array | |
| * - parameters (route parameters if $url is a route and not an URI) | |
| * - body: string|null | |
| * | |
| * @return RequestInterface | |
| * | |
| * @throws RouteNotFoundException If the named route doesn't exist | |
| * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route | |
| * @throws InvalidParameterException When a parameter value for a placeholder is not correct because it | |
| * does not match the requirement | |
| */ | |
| public function createRequest($method, $url = null, $token = null, array $options = []) | |
| { | |
| // Extract route parameters | |
| $parameters = []; | |
| if (true === array_key_exists('parameters', $options)) { | |
| $parameters = $options['parameters']; | |
| } | |
| // If Query is an array cast it to string | |
| $uri = null; | |
| if (true === array_key_exists('query', $options)) { | |
| if (true === is_array($options['query'])) { | |
| $uri = http_build_query($options['query']); | |
| } elseif (true === is_string($options['query'])) { | |
| $uri = $options['query']; | |
| } | |
| } | |
| // Build URL with query parameters | |
| $url = (null === $uri) | |
| ? $this->urlBuilder->buildUrl($this->baseUrl, $url, $parameters) | |
| : sprintf('%s?%s', $this->urlBuilder->buildUrl($this->baseUrl, $url, $parameters), $uri) | |
| ; | |
| return new Request($method, $url, $this->getHeaders($token, $options)); | |
| } | |
| /** | |
| * @return string | |
| */ | |
| public function getBaseUrl() | |
| { | |
| return $this->baseUrl; | |
| } | |
| /** | |
| * Gets the request headers from the headers given in the options and add the authorization header if the API | |
| * token is provided. | |
| * | |
| * @param string|null $token API token. | |
| * @param array $options Array of request options | |
| * | |
| * @return string[] | |
| */ | |
| private function getHeaders($token = null, array $options = []) | |
| { | |
| if (null !== $token) { | |
| $options['headers']['authorization'] = sprintf('Bearer %s', $token); | |
| } | |
| return (true === array_key_exists('headers', $options)) ? $options['headers'] : []; | |
| } | |
| } |