You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
// TODO: the call to getReference is most likely to fail with complex identifiers
) 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;
}
}
The text was updated successfully, but these errors were encountered:
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 (
core/src/Doctrine/Common/State/PersistProcessor.php
Line 58 in 5523bf5
How to reproduce
Possible Solution
Awaiting a resolution I have added a specific Processor as workaround
The text was updated successfully, but these errors were encountered: