我試圖覆寫 PUT 操作以在特定條件下執行我的操作。也就是說,如果發送的物件與原始物件(來自資料庫)不同,那么我需要創建一個新物件并在不更改原始物件的情況下回傳它。
現在,當我執行查詢時,我得到了一個新物件,正如預期的那樣,但問題是原始物件也發生了變化
物體
#[ApiResource(
operations: [
new Get(),
new GetCollection(),
new Post(controller: CreateAction::class),
new Put(processor: EntityStateProcessor::class),
],
paginationEnabled: false
)]
class Entity
物體狀態處理器
final class PageStateProcessor implements ProcessorInterface
{
private ProcessorInterface $decorated;
private EntityCompare $entityCompare;
public function __construct(ProcessorInterface $decorated, EntityCompare $entityCompare)
{
$this->decorated = $decorated;
$this->entityCompare = $entityCompare;
}
public function process($data, Operation $operation, array $uriVariables = [], array $context = [])
{
if (($this->entityCompare)($data)) { // checking for object changes
$new_entity = clone $data; // (without id)
// do something with new entity
return $this->decorated->process($new_entity, $operation, $uriVariables, $context);
}
return $data;
}
}
我不明白為什么會這樣,所以我將原始物件的克隆回傳給行程。如果有人能告訴我我的錯誤是什么,那就太好了。
在回傳程序之前,我還嘗試了以下操作
$this->entityManager->refresh($data);- 這里我假設物件的原始實體將用資料庫中的資料更新,而物件不會用查詢中的資料更新$this->entityManager->getUnitOfWork()->detach($data);- 這里我假設物件將不再可管理并且不會被更新
但在這兩種情況下,原始 $data 的狀態都會發生變化。
我正在使用 ApiPlatform 3.0.2
uj5u.com熱心網友回復:
錯誤是主要物體與附加物體相關,因此僅將主要物體與 分離是不夠的UnitOfWork。因此,使用該Doctrine\ORM\UnitOfWork->clear(YourEntity::class)方法分離物體的所有實體,并對關系執行相同的操作。
一旦物體被分離,克隆物體就變得毫無意義,因為以前的物體實體不是由 Doctrine ORM 管理的,所以我的代碼會像這樣重新排列自己:
public function process($data, Operation $operation, array $uriVariables = [], array $context = [])
{
if (($this->entityCompare)($data)) { // checking for object changes
$this->getEntityManager()->getUnitOfWork()->clear(Entity::class);
$this->getEntityManager()->getUnitOfWork()->clear(EelatedEntity::class);
// do something with new entity
return $this->decorated->process($data, $operation, $uriVariables, $context);
}
return $data;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533872.html
下一篇:目錄不存在時的例外
