# Identifiers Every item operation has an identifier in its URL. Although this identifier is usually a number, it can also be an `UUID`, a date, or the type of your choice. To help with your development experience, we introduced an identifier normalization process. ## Custom Identifier Normalizer > [!WARNING] > This feature is not yet available with Laravel, if you need it please open a Feature Request issue! > In the following chapter, we're assuming that `App\Uuid` is a project-owned class that manages a time-based UUID. Let's say you have the following class, which is identified by a `UUID` type. In this example, `UUID` is not a simple string but an object with many attributes. ```php ``` Once registered as an `ApiResource`, having an existing person, it will be accessible through the following URL: `/people/110e8400-e29b-11d4-a716-446655440000`. Note that the property identifying our resource is named `code`. Let's create a `Provider` for the `Person` resource: ```php */ final class PersonProvider implements ProviderInterface { public function provide(Operation $operation, array $uriVariables = [], array $context = []): Person { // Our identifier is: // $uriVariables['code'] // although it's a string, it's not an instance of Uuid and we wanted to retrieve the timestamp of our time-based uuid: // $uriVariable['code']->getTimestamp() } } ``` To cover this use case, we need to `transform` the identifier to an instance of our `App\Uuid` class. This case is covered by an URI variable transformer: ```php getMessage()); } } /** * Checks whether the given uri variable is supported for transformation by this transformer. * * @param mixed $value The uri variable value to transform * @param array $types The types to which the data should be transformed * @param array $context Options available to the transformer */ public function supportsTransformation($value, array $types, array $context = []): bool { foreach ($types as $type) { if (is_a($type, Uuid::class, true)) { return true; } } return false; } } ``` Tag this service as an `api_platform.uri_variables.transformer` using one of the configurations below: ### Tag the Service using Symfony ```yaml # api/config/services.yaml # The YAML syntax is only supported for Symfony services: App\Identifier\UuidUriVariableTransformer: tags: - { name: api_platform.uri_variables.transformer } ``` ```xml ``` Your `PersonProvider` will now work as expected! ## Changing Identifier in a Doctrine Entity If your resource is also a Doctrine entity and you want to use another identifier other than the Doctrine one, you have to unmark it: ```php