Как мне настроить идентификатор для пользовательской операции DTO без использования аннотаций?

#php #symfony #api-platform.com

#php #symfony #api-platform.com

Вопрос:

Создал очень простой ресурс на основе DTO. Вся логика будет предоставляться через пользовательский DataProvider интерфейс, и для этого проекта аннотации не используются.

Конфигурация для ресурса:

 <resources xmlns="https://api-platform.com/schema/metadata">
    <resource class="AppDomainDtoProductUpgradePrice">

        <collectionOperations>
            <collectionOperation name="get"/>
        </collectionOperations>

        <itemOperations>
            <itemOperation name="get"/>
        </itemOperations>

    </resource>
</resources>
 

Фактический DTO:

 <?php declare(strict_types=1);

namespace AppDomainDto;

/** @psalm-immutable */
class ProductUpgradePrice
{

    public function __construct(
        public string $productId,
        public int $regularPrice,
        public int $upgradePrice
    ) {}

}
 

Когда я пытаюсь GET /api/product_upgrade_prices , я получаю:

Для ресурса типа App Domain Dto ProductUpgradePrice не определены идентификаторы

Что имеет смысл.

В документах упоминается использование аннотации @ApiProperty , но, как я упоминал ранее, никаких аннотаций для этого проекта нет. (Я отправил запрос на обновление документов с тех пор, как опубликовал вопрос, который был объединен, поэтому, надеюсь, будущие пользователи не попадут в такую же ситуацию)

Я попытался добавить это в конфигурацию ресурса:

 <property name="productId">
    <attribute name="identifier">true</attribute>
</property>
 

Но получил те же результаты.

Как я могу настроить это без использования аннотаций?

Ответ №1:


Просматривая метаданные XSD, в строке 113 вы можете увидеть этот атрибут для property элемента:

 <xsd:attribute type="xsd:boolean" name="identifier"/>
 

Что означает, что вы должны использовать это вместо:

 <property identifier="true" name="id" />
 

Комментарии:

1. Спасибо за помощь. Я не знаю, как я это пропустил. Надеюсь, это будет полезно для кого-то еще.