api-platform
api-platform copied to clipboard
Allow dot in IRI
Description
It is currently not possible to have a dot "." in an IRI.
Effectively, posting a resource containg a dot in its id would lead to the following error : "Unable to generate an IRI for "MyClass", triggered into api-platform/core/src/Bridge/Symfony/Routing/IriConverter.php line 155".
Behind the scene it is an error from symfony/routing/Generator/UrlGenerator.php line 193 : Parameter "id" for route "my_route_get_item" must match "[^/.]++" ("iri.withdot" given) to generate a corresponding URL.
It seems to me that it should be allowed to have a dot in an IRI as it's not part of the reserved URI characters.
How to reproduce
Try to post a resource (Entity, DTO) with an id containing a dot.
Possible Solution
For POST operations : change in api-platform/core/src/Bridge/Symfony/Routing/Router.php, the generate() method for
public function generate($name, $parameters = [], $referenceType = self::ABS_PATH)
{
// Disable strict_requirements to allow dot in IRIs
$this->router->setOption('strict_requirements', false);
return $this->router->generate($name, $parameters, self::CONST_MAP[$referenceType]);
}
Additional Context
Allowing a dot in IRIs would lead to troubles with GET operations as an IRI like "a.b" would lead to the following error : Format "b" is not supported. Effectively, b would be considered to be the format. In this case, maybe it could be possible to specify the format
in a Accept header only.
Additionnal informations pleading for the support of the . character : . is indeed a valid character according to RFC 3986
RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax
I too would like to see a dot (period) supported. I have an entity MediaType which has a surrogate ID and contains all the media types per https://www.iana.org/assignments/media-types/media-types.xhtml. Originally, I tried to make the identifier the full name (application/index.cmd), but had issues with the forward slash (however, adding 'requirements' => ['identifier' => '.+'] helps. Ended up changing to a composite identifier (type/subtype) and it works fine until I have a period in the subtype.