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 关注
- 111 浏览
添加回答
举报