很多框架都使用诸如/controller/action/{id}这样的URL约定,这是很棒的,但是如果您需要任何其他配置,则由您自己编写自己的路由。
在后端如何处理像/users/{id}/friends这样的URL?(列出所有用户的朋友)
我在想,在控制器中,这样的东西是合适的:
class User {
function index() {
echo 'user index';
}
}
class Friend extends User {
function index($user_id) {
echo 'friend index';
}
}然后,您将得到以下地图:
/users -> User::index()
/users/{id} -> User::view($id)
/users/{id}/friends -> Friend::index($user_id)我想把好友类放在User类中,但是显然您不能在PHP中这样做,所以这是我能想到的最好的方法。有什么想法?
什么网址可以用来编辑你的朋友名单?/users/{id}/friends/edit可以工作,但这似乎不合适,因为你永远不应该编辑别人的朋友名单。/account/friends/edit会是更好的选择吗?你会把相应的代码放在哪里?在一个朋友控制器,一个用户控制器,还是一个专门的帐户控制器?
附加问题:你喜欢哪一个?/photos/delete/{id}还是/photos/{id}/delete?
的答案:
所以,我从答案中得到的是,如果“事物”很复杂(比如“朋友”),但没有它自己的控制器,你可以在没有模型的情况下给它一个控制器,或者如果没有,你应该把它和它最密切相关的东西一起塞进去。您的URL不应该影响您放置代码的位置。大多数人似乎认为你应该尽可能地坚持使用/controller/action/{id},因为这是人们所熟悉的。
除了说这是“尴尬”之外,没有人真的对扩展的课程发表评论。如果我真的想把它分开的话,在这种情况下,FriendList可能是一个更合适的类。
谢谢你的回答:)
发布于 2009-06-22 22:00:03
您正在谈论的路线,以及您使用子类来实现这种结构的方式,在我看来都有点尴尬。/controller/action/{id}的标准约定对于简单操作非常有用,但是如果您要创建一个复杂的应用程序,则始终需要创建自定义路由。在创建这些路径时,可能有一些很好的指导原则,但实际上,它可以归结为在整个应用程序中保持一致,并尽可能保持简单。
我看不出有什么好的理由让/user/{id}/friends映射到"Friend“控制器。为什么不让"friends“作为User控制器上的一个动作呢?一旦您实际向下钻取以查看特定朋友的页面,您可以使用一个Friend控制器(/friends/view/123),或者您可以重新使用您的User控制器,以便它对朋友或当前登录的用户(/user/view/123)起作用。
评论:奖金问题,我坚持/photos/delete/{id} (/controller/action/{id}),因为这是最广泛接受的机制。
发布于 2009-06-22 22:01:21
我更喜欢/photos/{id}/delete。我的推理是,如果从URL的末尾删除一个组件,它仍然是有意义的。
很容易假设/photos/{id}应该做什么:查看该{id}的照片集。
但是/photos/delete应该做什么呢?这还不清楚。
我知道有一种默认的/controller/action/id约定,但该组织是为了映射到控制器的类/方法体系结构。我不认为组织UI以适应代码是一个好主意( URL在某种程度上是UI的一部分)。
重新评论:是的,/photos/{id}可能更有意义通过它的id来查看给定的照片。/users/{id}/photos也许可以查看一个集合。由你决定。
关键是,您应该从用户的角度来考虑UI,而不是从代码组织的角度来考虑UI。
发布于 2009-06-22 22:53:58
你可以做任何一件事或者。问题是当你把两者混合在一起的时候。/user/{ id }/friends和/user/朋友/{id}当某人有“朋友”的id时,这将失败。这似乎是一种琐碎的情况,但使用用户名作为ids是非常流行的。您必须限制每个操作的用户名。
有时你不能做/{controller}/{action}/{id}
一段时间前我做了一个独立音乐网站,我们做了
/artist/{username}
/artist/{username}/albums
/artist/{username}/albums/{album}我们不想测试条件,所以我们没有
/artist/{username}/{album}因为我们不想找谁有一张专辑叫“专辑”
我们本可以做到的
/artist/{username}
/artist/{username}/albums
/albums/{album}但那样的话,我们将失去SEO的优势,有两个艺术家的名字和专辑名称在URL中。此外,在这种情况下,我们将强制专辑名称是唯一的,这将是不好的,因为这是常见的艺术家有相同的专辑名称与其他艺术家。
你可以做纯/{controller}/{action}/{id},但你会失去一些搜索引擎优化,你不能做网址缩短。
/artist/view/{username}
/artist/albums/{username}
/album/view/{album}回到你的例子。
用户/{id}/朋友/编辑可以工作,但这似乎不合适,因为您永远不应该编辑其他人的好友列表。
在这种情况下,应该是/friends/edit,因为您的用户id是重复的信息,假设您在会话中使用。通常,您希望支持URL缩短,而不是URL扩展。
(额外的问题)我也不会使用休息。DELETE /photo?id={id}
https://stackoverflow.com/questions/1029555
复制相似问题