我目前正在使用 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}
。
{id}
?{categoryId}
中使用不同的参数,例如uriTemplate
?{id}
以外的参数?任何见解或例子将不胜感激!
我遇到了同样的问题,发现可以通过使用 uriVariable 属性来使用自定义变量名称。
uriTemplate: '/categories/{categoryId}',
uriVariables: ['categoryId'],