2 回答

TA貢獻1853條經驗 獲得超9個贊
在這種情況下,我總是使用 API 過濾器(https://api-platform.com/docs/core/filters/)。在發送 POST 請求之前,請發送 GET 請求以檢查實體是否存在。例如,為過濾器添加注釋:
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
/**
* @ORM\Entity(repositoryClass=CartItemRepository::class)
* @ApiResource(
* collectionOperations={"get","post"},
* itemOperations={"get","patch"},
* normalizationContext={"groups"={"cart_item:read"}}
* )
* @UniqueEntity(fields={"product","cart"})
*
* @ApiFilter(SearchFilter::class, properties={"product": "exact", "cart": "exact"})
*/
class CartItem
{
private $id;
private $product;
private $quantity;
private $cart;
/* ... */
}
并使用 URL 來獲取現有實體,如下所示:GET /cart_items?product=3&cart=2您應該獲取一個集合。因此,如果 "hydra:totalItems" > 0從響應中,您可以從中檢索 iri"hydra:member"[0]

TA貢獻1966條經驗 獲得超4個贊
您需要創建自定義 @Assert,因為這是您使用處理該作業的兩個服務的唯一方法:
購物車項目存儲庫,
虹膜轉換器接口
首先,創建 Constraint 類MyUniqueCartItem。向類聲明其用法,以便您可以在驗證期間訪問所有屬性:
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
然后,創建MyUniqueCartItemValidator,并將之前的兩個服務自動連接到它。使用CartItemRepository檢查實體是否已存在,并使用IriConverterInterface檢索 IRI:
public function validate($value, Constraint $constraint)
{
// i make it short, just take look ath the doc
$criteria = ['cart' => $value->getCart(), 'product' => $value->getProduct()]
$duplicated = $this->cartItemRepository->findOneBy($criteria);
if ($duplicated !== null) {
$iri = $this->iriConverterInterface->getIriFromItem($duplicated);
$this->context->buildViolation("Duplicated entity : $iri" )
->atPath('whatever')
->addViolation();
}
}
請注意,您可以通過向MyUniqueCartItem添加一些屬性(在其中指定所需條件和存儲庫)來將MyUniqueCartItem設為通用約束MyUniqueEntity。在MyUniqueEntityValidator中,將CartItemRepository替換為EntityManagerInterface并獲取存儲庫:
$repository = $this->entityManger->getRepository($constraint->entityClass);
- 2 回答
- 0 關注
- 149 瀏覽
添加回答
舉報