了解 Symfony API 平台中的 uriTemplate 和变量 ID

问题描述 投票:0回答:1

我目前正在使用 API 平台开发 Symfony 项目,并且对于 uriTemplate 系统及其如何处理变量 ID 遇到一些困惑。

我有一个名为 Article 的实体,我想设置一个使用

{id}
以外的参数的自定义收集路由。具体来说,我想使用
{categoryId}
。但是,当我尝试这样做时遇到了问题,并且我不确定为什么 API Platform 似乎坚持使用
{id}

这是我的文章实体配置的示例:

<?php
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use App\State\ArticlesByCategoryProvider;

#[ApiResource(
    operations: [
        new Get(
            uriTemplate: '/{id}',
            requirements: ['id' => '\d+']
        ),
        new GetCollection(
            uriTemplate: '/categories/{categoryId}',
            provider: ArticlesByCategoryProvider::class
        )
    ],
    routePrefix: '/articles',
    normalizationContext: ['groups' => ['articles_read']],
    denormalizationContext: ['groups' => ['articles_write']]
)]
class Article
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    #[Groups(['articles_read'])]
    private ?int $id = null;

    #[ORM\Column(length: 255)]
    #[Groups(['articles_read', 'articles_write'])]
    private ?string $title = null;

    #[ORM\Column(type: 'text')]
    #[Groups(['articles_read', 'articles_write'])]
    private ?string $content = null;

    #[ORM\ManyToOne(targetEntity: Category::class)]
    #[ORM\JoinColumn(nullable: false)]
    #[Groups(['articles_read', 'articles_write'])]
    private ?Category $category = null;

    // Other fields and methods...
}

问题

当我尝试访问

/api/articles/categories/{categoryId}
时,API 平台似乎尝试将
{categoryId}
解析为文章实体本身的 id,从而导致此错误:

“标识符值或配置无效。”

我能够通过放置

/categories/{id}
来解决我的问题,但我想知道我们是否可以解决这个问题,知道我可以在 URL 中包含多个实体,例如
/categories/{categoryId}/tags/{tagId}

问题

  • 为什么 API 平台强制使用
    {id}
  • 有没有办法在
    {categoryId}
    中使用不同的参数,例如
    uriTemplate
  • 如何配置我的路由和提供程序以使用
    {id}
    以外的参数?

任何见解或例子将不胜感激!

php symfony api-platform.com
1个回答
0
投票

我遇到了同样的问题,发现可以通过使用 uriVariable 属性来使用自定义变量名称。

uriTemplate: '/categories/{categoryId}',
uriVariables: ['categoryId'],
© www.soinside.com 2019 - 2024. All rights reserved.