Google\Cloud\RequestBuilder::build PHP Method

build() public method

Build the request.
public build ( string $resource, string $method, array $options = [] ) : Psr\Http\Message\RequestInterface
$resource string
$method string
$options array [optional]
return Psr\Http\Message\RequestInterface
    public function build($resource, $method, array $options = [])
    {
        $root = $this->resourceRoot;
        array_push($root, 'resources');
        $root = array_merge($root, explode('.', $resource));
        array_push($root, 'methods', $method);
        $action = $this->service;
        foreach ($root as $rootItem) {
            if (!isset($action[$rootItem])) {
                throw new \InvalidArgumentException('Provided path item ' . $rootItem . ' does not exist.');
            }
            $action = $action[$rootItem];
        }
        $path = [];
        $query = [];
        $body = [];
        if (isset($action['parameters'])) {
            foreach ($action['parameters'] as $parameter => $parameterOptions) {
                if ($parameterOptions['location'] === 'path' && array_key_exists($parameter, $options)) {
                    $path[$parameter] = $options[$parameter];
                    unset($options[$parameter]);
                }
                if ($parameterOptions['location'] === 'query' && array_key_exists($parameter, $options)) {
                    $query[$parameter] = $options[$parameter];
                }
            }
        }
        if (isset($this->service['parameters'])) {
            foreach ($this->service['parameters'] as $parameter => $parameterOptions) {
                if ($parameterOptions['location'] === 'query' && array_key_exists($parameter, $options)) {
                    $query[$parameter] = $options[$parameter];
                }
            }
        }
        if (isset($action['request'])) {
            $schema = $action['request']['$ref'];
            foreach ($this->service['schemas'][$schema]['properties'] as $property => $propertyOptions) {
                if (array_key_exists($property, $options)) {
                    $body[$property] = $options[$property];
                }
            }
        }
        $uri = $this->buildUriWithQuery($this->expandUri($this->baseUri . $action['path'], $path), $query);
        return new Request($action['httpMethod'], $uri, ['Content-Type' => 'application/json'], $body ? json_encode($body) : null);
    }

Usage Example

 public function testBuildsNestedRequestWithStringSplitting()
 {
     $builder = new RequestBuilder(__DIR__ . '/fixtures/service-fixture.json', 'http://www.example.com/', ['resources', 'projects', 'otherThing']);
     $parameters = ['queryParam' => 'query', 'pathParam' => 'path', 'referenceProp' => 'reference'];
     $request = $builder->build('myOtherResource.resources.evenMoreNestedThing', 'evenMoreNestedResource', $parameters);
     $uri = $request->getUri();
     $this->assertEquals('/path', $uri->getPath());
     $this->assertEquals('queryParam=query', $uri->getQuery());
     $this->assertEquals('{"referenceProp":"reference"}', (string) $request->getBody());
 }