首页 > 解决方案 > 在 APi 平台中关闭端点的复数

问题描述

在 Symfony 5 项目中,我们使用 APi 平台生成 REST API。

其中一个实体类称为FarmMetadata.

<?php

namespace App\Entity;

use  ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ApiResource()
 * @ORM\Table(... some settings ...)
 * @ORM\Entity
 */
class FarmMetadata
{
    // properties and methods
}

当我运行php bin/console debug:router它时,它会显示此资源的以下路线:

api_farm_metadatas_get_collection    GET      ANY      ANY    /api/farm_metadatas.{_format}        
api_farm_metadatas_post_collection   POST     ANY      ANY    /api/farm_metadatas.{_format}        
api_farm_metadatas_get_item          GET      ANY      ANY    /api/farm_metadatas/{id}.{_format}   
api_farm_metadatas_delete_item       DELETE   ANY      ANY    /api/farm_metadatas/{id}.{_format}   
api_farm_metadatas_put_item          PUT      ANY      ANY    /api/farm_metadatas/{id}.{_format}   
api_farm_metadatas_patch_item        PATCH    ANY      ANY    /api/farm_metadatas/{id}.{_format}

然而,“元数据”这个词已经是复数了。没有元数据之类的东西。如何关闭此端点的复数?

我尝试使用shortName

* @ApiResource(
*     shortName="FarmMetadata" // also "farm_metadata"
* )

但它不会改变输出。

如果我使用:

* @ApiResource(
*     shortName="Metadata"
* )

然后更改路线名称和路径:

api_metadata_get_collection         GET      ANY      ANY    /api/metadata.{_format}              
api_metadata_post_collection        POST     ANY      ANY    /api/metadata.{_format}              
api_metadata_get_item               GET      ANY      ANY    /api/metadata/{id}.{_format}         
api_metadata_delete_item            DELETE   ANY      ANY    /api/metadata/{id}.{_format}         
api_metadata_put_item               PUT      ANY      ANY    /api/metadata/{id}.{_format}         
api_metadata_patch_item             PATCH    ANY      ANY    /api/metadata/{id}.{_format}

但这不是我想要的。

我知道我可以为每个操作声明一条路径,但这会损害 DRY 原则。

我怎样才能实现所需的行为?

标签: phprestsymfonyapi-platform.com

解决方案


我不认为这是通过配置实现的:这些路由是在私有方法中构建的ApiPlatform\Core\Bridge\Symfony\Routing\ApiLoader::addRoute(至少在我使用的 v2.6 中),并且这使用了对复数器的静态调用 - 所以:装饰 ApiLoader 不是很容易实现(因为 addRoute 方法是私有的),并且无法交换生成路由的方式(由于使用静态方法调用)。

看起来您需要在他们的错误跟踪器中打开功能请求票...


推荐阅读