Это поведение специфично для СУБД c, поэтому вам нужно добавить свой собственный logi c.
Компонент API-Platform, который извлекает сущность с идентификатором, - это ItemDataProviderInterface .
- Сначала я объявлю новое исключение
MalformedUuidException
. - Затем я конвертирую это исключение в ошибку 400 .
- Наконец, я создам новую реализацию ItemDataProviderInterface, обернув ORM и добавив несколько проверок к идентификатору:
class ContractDataProvider implements RestrictedDataProviderInterface, ItemDataProviderInterface
{
/** @var ItemDataProviderInterface */
private $realDataProvider;
public function __construct(ItemDataProviderInterface $realDataProvider)
{
$this->realDataProvider = $realDataProvider;
}
public function getItem(string $resourceClass, $id, string $operationName = null, array $context = [])
{
$uuidPattern = '/^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/i';
if (preg_match($uuidPattern, $id) === 1) {
return $this->realDataProvider->getItem($resourceClass, ['id' => $id], $operationName, $context);
} else {
throw new MalformedUuidException("the given ID \"$id\" is not a valid UUID.");
}
}
public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
{
return $resourceClass === Contract::class;
}
}
# config/services.yaml
App\DataProvider\ContractDataProvider:
arguments:
$realDataProvider: '@api_platform.doctrine.orm.default.item_data_provider'
Однако обратите внимание, что контракт метода getItem()
не указывает исключение MalformedUuidException
, поэтому эта реализация нарушает принцип подстановки Лискова.
Рассмотрите возможность возврата значения null вместо этого и удовлетворитесь ошибкой 404.