Open
Description
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 (
) 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;
}
}