public function testValueObject() { $metadata = new ResourceMetadata('shortName', 'desc', 'http://example.com/foo', ['iop1' => ['foo' => 'a'], 'iop2' => ['bar' => 'b']], ['cop1' => ['foo' => 'c'], 'cop2' => ['bar' => 'd']], ['baz' => 'bar']); $this->assertEquals('shortName', $metadata->getShortName()); $this->assertEquals('desc', $metadata->getDescription()); $this->assertEquals('http://example.com/foo', $metadata->getIri()); $this->assertEquals(['iop1' => ['foo' => 'a'], 'iop2' => ['bar' => 'b']], $metadata->getItemOperations()); $this->assertEquals('a', $metadata->getItemOperationAttribute('iop1', 'foo', 'z', false)); $this->assertEquals('bar', $metadata->getItemOperationAttribute('iop1', 'baz', 'z', true)); $this->assertEquals('z', $metadata->getItemOperationAttribute('iop1', 'notExist', 'z', true)); $this->assertEquals('z', $metadata->getItemOperationAttribute('notExist', 'notExist', 'z', true)); $this->assertEquals(['cop1' => ['foo' => 'c'], 'cop2' => ['bar' => 'd']], $metadata->getCollectionOperations()); $this->assertEquals('c', $metadata->getCollectionOperationAttribute('cop1', 'foo', 'z', false)); $this->assertEquals('bar', $metadata->getCollectionOperationAttribute('cop1', 'baz', 'z', true)); $this->assertEquals('z', $metadata->getCollectionOperationAttribute('cop1', 'notExist', 'z', true)); $this->assertEquals('z', $metadata->getCollectionOperationAttribute('notExist', 'notExist', 'z', true)); $this->assertEquals(['baz' => 'bar'], $metadata->getAttributes()); $this->assertEquals('bar', $metadata->getAttribute('baz')); $this->assertEquals('z', $metadata->getAttribute('notExist', 'z')); $newMetadata = $metadata->withShortName('name'); $this->assertNotSame($metadata, $newMetadata); $this->assertEquals('name', $newMetadata->getShortName()); $newMetadata = $metadata->withDescription('description'); $this->assertNotSame($metadata, $newMetadata); $this->assertEquals('description', $newMetadata->getDescription()); $newMetadata = $metadata->withIri('foo:bar'); $this->assertNotSame($metadata, $newMetadata); $this->assertEquals('foo:bar', $newMetadata->getIri()); $newMetadata = $metadata->withItemOperations(['a' => ['b' => 'c']]); $this->assertNotSame($metadata, $newMetadata); $this->assertEquals(['a' => ['b' => 'c']], $newMetadata->getItemOperations()); $newMetadata = $metadata->withCollectionOperations(['a' => ['b' => 'c']]); $this->assertNotSame($metadata, $newMetadata); $this->assertEquals(['a' => ['b' => 'c']], $newMetadata->getCollectionOperations()); $newMetadata = $metadata->withAttributes(['a' => ['b' => 'c']]); $this->assertNotSame($metadata, $newMetadata); $this->assertEquals(['a' => ['b' => 'c']], $newMetadata->getAttributes()); }
/** * Gets and populates if applicable a Hydra operation. * * @param string $resourceClass * @param ResourceMetadata $resourceMetadata * @param string $operationName * @param array $operation * @param string $prefixedShortName * @param bool $collection * * @return array */ private function getHydraOperation(string $resourceClass, ResourceMetadata $resourceMetadata, string $operationName, array $operation, string $prefixedShortName, bool $collection) : array { if ($collection) { $method = $this->operationMethodResolver->getCollectionOperationMethod($resourceClass, $operationName); } else { $method = $this->operationMethodResolver->getItemOperationMethod($resourceClass, $operationName); } $hydraOperation = $operation['hydra_context'] ?? []; $shortName = $resourceMetadata->getShortName(); if ('GET' === $method && $collection) { $hydraOperation = ['hydra:title' => sprintf('Retrieves the collection of %s resources.', $shortName), 'returns' => 'hydra:PagedCollection'] + $hydraOperation; } elseif ('GET' === $method) { $hydraOperation = ['hydra:title' => sprintf('Retrieves %s resource.', $shortName), 'returns' => $prefixedShortName] + $hydraOperation; } elseif ('POST' === $method) { $hydraOperation = ['@type' => 'hydra:CreateResourceOperation', 'hydra:title' => sprintf('Creates a %s resource.', $shortName), 'returns' => $prefixedShortName, 'expects' => $prefixedShortName] + $hydraOperation; } elseif ('PUT' === $method) { $hydraOperation = ['@type' => 'hydra:ReplaceResourceOperation', 'hydra:title' => sprintf('Replaces the %s resource.', $shortName), 'returns' => $prefixedShortName, 'expects' => $prefixedShortName] + $hydraOperation; } elseif ('DELETE' === $method) { $hydraOperation = ['hydra:title' => sprintf('Deletes the %s resource.', $shortName), 'returns' => 'owl:Nothing'] + $hydraOperation; } $hydraOperation['@type'] ?? ($hydraOperation['@type'] = 'hydra:Operation'); $hydraOperation['hydra:method'] ?? ($hydraOperation['hydra:method'] = $method); if (!isset($hydraOperation['rdfs:label']) && isset($hydraOperation['hydra:title'])) { $hydraOperation['rdfs:label'] = $hydraOperation['hydra:title']; } ksort($hydraOperation); return $hydraOperation; }
/** * @param \ArrayObject $definitions * @param bool $collection * @param bool $parameter * @param ResourceMetadata $resourceMetadata * @param string $resourceClass * @param string $operationName * * @return string */ private function getDefinition(\ArrayObject $definitions, bool $collection, bool $parameter, ResourceMetadata $resourceMetadata, string $resourceClass, string $operationName) : string { $contextKey = $parameter ? 'denormalization_context' : 'normalization_context'; $serializerContext = $collection ? $resourceMetadata->getCollectionOperationAttribute($operationName, $contextKey, null, true) : $resourceMetadata->getItemOperationAttribute($operationName, $contextKey, null, true); if (isset($serializerContext['groups'])) { $definitionKey = sprintf('%s_%s', $resourceMetadata->getShortName(), md5(serialize($serializerContext['groups']))); } else { $definitionKey = $resourceMetadata->getShortName(); } $definitions[$definitionKey] = $this->getDefinitionSchema($resourceClass, $resourceMetadata, $serializerContext); return $definitionKey; }