亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以通過API平臺獲取違規條目的IRI嗎?

我可以通過API平臺獲取違規條目的IRI嗎?

PHP
呼啦一陣風 2023-08-06 14:36:35
我有一個 Symfony 5 項目,使用symfony/api(API 平臺)和一個具有UniqueEntity約束的實體(見下文。為了更好的可理解性,我省略了字段注釋,因為它們在這里不相關。):/** * @ORM\Entity(repositoryClass=CartItemRepository::class) * @ApiResource( *     collectionOperations={"get","post"}, *     itemOperations={"get","patch"}, *     normalizationContext={"groups"={"cart_item:read"}} * ) * @UniqueEntity(fields={"product","cart"}) */class CartItem{    private $id;    private $product;    private $quantity;    private $cart;    /* ... */}假設我有一些數據:----------------------------------------| id | product_id | cart_id | quantity ||  1 |          3 |       2 |        1 ||  2 |          2 |       2 |        2 |----------------------------------------現在如果我發送這個 POST 請求:{  "product": "/api/products/3",  "quantity": 1,  "cart": "/api/carts/2"}我當然會期待這個響應,因為插入此條目會破壞because is 已被 ID 1 使用的400唯一性:[product_id,cart_id][3,2]{  "@context": "/api/contexts/ConstraintViolationList",  "@type": "ConstraintViolationList",  "hydra:title": "An error occurred",  "hydra:description": "product: This value is already used.",  "violations": [    {      "propertyPath": "product",      "message": "This value is already used."    }  ]}我的問題是:我有辦法獲取“重復”實體的 IRI 或 ID 嗎?(在這里,ID 為 1,IRI 為/api/cart_items/1)。我想通過此實現的是ON DUPLICATE KEY UPDATE quantity = quantity + :quantity通過檢測此錯誤并PATCH在發生錯誤時發送請求來重現 MySQL 的行為,但要發送請求PATCH,我需要 IRI,或者至少需要我想要修補的項目的 ID。
查看完整描述

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]


查看完整回答
反對 回復 2023-08-06
?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

您需要創建自定義 @Assert,因為這是您使用處理該作業的兩個服務的唯一方法:

  1. 購物車項目存儲庫,

  2. 虹膜轉換器接口

首先,創建 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);


查看完整回答
反對 回復 2023-08-06
  • 2 回答
  • 0 關注
  • 149 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號