/** * @cover ::buildUrl * @dataProvider urlWithRouteProvider */ public function testBuildUrlWithRoute($baseUrl, $uri, $parameters, $expected) { $routerProphecy = $this->prophesize(RouterInterface::class); $routerProphecy->generate('my_route', [])->willReturn('/my/route'); $routerProphecy->generate('my_route', ['id' => 14])->willReturn('/my/route/14'); $urlBuilder = new UrlBuilder($routerProphecy->reveal()); $this->assertEquals($expected, $urlBuilder->buildUrl($baseUrl, $uri, $parameters)); }
/** * 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)); }