PUT queries on a Resource with a composite key fail with a duplicate key error
API Platform version(s) affected: 3.2.16
Description
After an update in the latest version of ApiPlatform (from v2.7.x)
Each PUT calls on Resources with composite keys fail with a duplicate error.
It seems that the detection of the existing object fails and so the doctrine flush() try to create the resource rather than updated it.
The limitation seems known (https://github.com/api-platform/core/blob/5523bf5df93783582bed5591ff35c71e0942a978/src/Doctrine/Common/State/PersistProcessor.php#L58) but I prefer to create an issue so we can follow the resolution.
How to reproduce
- create a Resource (also Doctrine entity) with a composite Id
- POST a new resource
- Set a PUT on this resource
- The error is triggered
Possible Solution
Awaiting a resolution I have added a specific Processor as workaround
<?php
namespace App\State\Processor;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\Metadata\Put;
use ApiPlatform\State\ProcessorInterface;
use App\Entity\Admin\EntityInterface;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
/**
* @implements ProcessorInterface<EntityInterface,EntityInterface>
*/
class CompositeIdentifierPutProcessor implements ProcessorInterface
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
) {
}
/**
* @throws Exception
*/
public function process(
mixed $data,
Operation $operation,
array $uriVariables = [],
array $context = []
): EntityInterface {
if (!$operation instanceof Put) {
throw new Exception('Invalid Operation');
}
if (isset($uriVariables['id']['identifiers']) && count($uriVariables['id']['identifiers']) < 2) {
throw new Exception('This processor should only be used for a Resource with composite identifier');
}
$this->entityManager->flush();
return $data;
}
}
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.