我正在建立我的第一个apigility项目,到目前为止一切顺利。我遇到了一些路由问题以及如何设置它。
假设我有歌曲,专辑和艺术家(仅针对此问题的虚构示例)。我想做一个像这样的结构:
/artists (GET, POST, PUT, PATCH, DELETE)
/albums (GET, POST, PUT, PATCH, DELETE)
/songs (GET, POST, PUT, PATCH, DELETE)
到目前为止很容易。我对这些终点进行了过滤,所以我可以说:
/artists/?style=jazz
/albums/?year=2012
etc...
现在,我还希望包含这样的子端点:
/artist/12345/albums (GET) - get all albums for artists with id 12345
/artist/12345/songs (GET) - get all songs for artists with id 12345
/albums/98765/songs (GET) - get all songs for album with id 98765
如何以适当的方式在apigility中设置它?
我首先创建了一个单独的服务ArtistAlbum,其中包含route / artists /:artist_id / albums,然后将实体从ArtistAlbumEntity更改为AlbumEntity(基本上就是那个)以及从ArtistAlbumCollection到AlbumCollection的集合。路由标识符名称设置为artist_album_id,但我永远不会使用。你不能删除它。
诚实地说,这种方式感觉有点黑客。
实际上,上述路线/ artists /:artist_id / albums实际上是/ albums /?artist_id =:artist_id的别名。这是一种过滤器。
如何以正确的方式实现这样的事情?
答案 0 :(得分:0)
您可以区分(REST)类/资源之间的不同类型的关系。
很好地解释了here on this blogpost,但这些关系类型也是nicely defined on Wikipedia。
了解这些类型的关系将有助于您了解如何定义模型中的(层次结构),它还可以帮助您组织网址。我不会在这里详细介绍,因为您已经可以在stackoverflow上找到关于关系类型,嵌套资源和休息设计的大量信息。我只会重复一些事情。例如 here , here , here , here < / strong>或 here 但您可以自己找到更多。
只需搜索:&#34;嵌套资源REST设计&#34;
网址设计没有一种普遍接受的解决方案。人们经常对如何处理这个问题有个人偏好。有些人(我不同意)甚至认为适当的休息模型不应该使用嵌套(所以没有分层)的网址,而是使用所有资源的扁平结构。
答案 1 :(得分:0)
考虑router
module.config.php
配置
<?php
[
'router' => [
'routes' => [
'api.rest' => [
'type' => 'Hostname',
'options' => [
'route' => 'api.site.dev'
],
'may_terminate' => false,
'child_routes' => [
'homeRoute' => [
'type' => 'Literal',
'options' => [
'route' => '/',
'defaults' => [
'controller' => 'Api\\V1\\Rest\\Welcome\\Controller',
]
],
'may_terminate' => true,
'child_routes' => [
'appRoute' => [
'type' => 'Literal',
'options' => [
'route' => 'app',
],
'may_terminate' => false,
'child_routes' => [
'postsRoute' => [
'type' => 'Literal',
'options' => [
'route' => '/posts',
'defaults' => [
'controller' => 'Api\\V1\\Rest\\Post\\Controller',
],
],
]
]
]
],
]
]
],
]
]
];
然后使用Apigility,如果您希望路由名称在Post
运行api.site.dev/app/posts
资源,请使用api.rest/homeRoute/appRoute/postsRoute
例如:使用此插件$this->url('api.rest/homeRoute/appRoute/postsRoute');
不知道它是否适用于旧版本,但实际上我使用的是Apigility 1.4.1,它就像一个魅力