如何通过 API-Platform 中的 XML create/define 子资源?

How to create/define a sub resource via XML in API-Platform?

我正在尝试使用 Api 平台通过 XML 创建子资源。

当我通过实体上的注释定义子资源时,一切都按预期工作:

Entity/SocialProfile/SocialProfile.php

/**
 * @ApiSubresource()
 * 
 * @ORM\OneToMany(
 *     targetEntity="SoapSyliusSocialPlugin\Entity\Follow\Follow",
 *     mappedBy="follower",
 *     cascade={ "persist", "remove" }
 * )
 */
protected $following;

一切正常,然后我可以通过以下路径访问子资源:

/api/v2/social-profiles/35471/followings

但是当我尝试通过 .xml 定义此 route/endpoint 时,如下所示:

Resources/config/api_resources/SocialProfile.xml

<?xml version="1.0" ?>

<resources xmlns="https://api-platform.com/schema/metadata"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="https://api-platform.com/schema/metadata https://api-platform.com/schema/metadata/metadata-2.0.xsd"
>
    <resource class="SoapSyliusSocialPlugin\Entity\SocialProfile\SocialProfile" shortName="SocialProfile">
        <attribute name="validation_groups">sylius</attribute>

        <subresourceOperations>
            <subresourceOperation name="api_social_profiles_followings_get_subresource">
                <attribute name="method">GET</attribute>
            </subresourceOperation>
        </subresourceOperations>

        <property name="following" writable="false" readable="true">
            <subresource resourceClass="SoapSyliusSocialPlugin\Entity\Follow\Follow" />
        </property>


    </resource>
</resources>

我得到一个:

404 No route found

我已经用 itemOperation 测试了我的 SocialProfile.xml 文件并且一切正常。

我已将 Resources/config/api_resources/SocialProfile.xml 更新为如下所示,但我仍然收到

404 route not found

    <?xml version="1.0" ?>

<resources xmlns="https://api-platform.com/schema/metadata"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="https://api-platform.com/schema/metadata https://api-platform.com/schema/metadata/metadata-2.0.xsd"
>
    <resource class="SoapSyliusSocialPlugin\Entity\SocialProfile\SocialProfile" shortName="SocialProfile">
        <attribute name="validation_groups">sylius</attribute>

        <itemOperations></itemOperations>

        <property name="following" writable="false" readable="true">
            <subresource resourceClass="SoapSyliusSocialPlugin\Entity\Follow\Follow"  collection="true"/>
        </property>

    </resource>
</resources>

实体持有子资源的配置(在本例中为SocialProfile)。

<?xml version="1.0" ?>

<resources xmlns="https://api-platform.com/schema/metadata"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="https://api-platform.com/schema/metadata https://api-platform.com/schema/metadata/metadata-2.0.xsd"
>
    <resource class="SoapSyliusSocialPlugin\Entity\SocialProfile\SocialProfile" shortName="SocialProfile">
        <attribute name="validation_groups">sylius</attribute>

        <property name="following" writable="false" readable="true">
            <subresource resourceClass="SoapSyliusSocialPlugin\Entity\Follow\Follow" />
        </property>

    </resource>
</resources>

要为子资源配置规范化组之类的东西,您可以在关系的另一端进行:

<?xml version="1.0" ?>

<resources xmlns="https://api-platform.com/schema/metadata"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="https://api-platform.com/schema/metadata https://api-platform.com/schema/metadata/metadata-2.0.xsd"
>
    <resource class="SoapSyliusSocialPlugin\Entity\Follow\Follow" shortName="Follow">
        
        <subresourceOperations>
            <subresourceOperation name="api_social_profiles_followings_get_subresource">
                <attribute name="method">GET</attribute>
            </subresourceOperation>
        </subresourceOperations>

    </resource>
</resources>

试试这个。我有一些这样的设置和工作。如果上面有问题应该是因为某些东西与您的 class/resource 名称不完全匹配,但您应该能够调整它来修复它。

请注意,在您问题的配置的第二个版本中,您 删除了 所有 itemOperations。您应该至少具有基本的 get 项目操作,以便图书馆能够构建 IRI。