首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP框架URL约定

PHP框架URL约定
EN

Stack Overflow用户
提问于 2009-06-22 21:45:43
回答 5查看 744关注 0票数 2

很多框架都使用诸如/controller/action/{id}这样的URL约定,这是很棒的,但是如果您需要任何其他配置,则由您自己编写自己的路由。

在后端如何处理像/users/{id}/friends这样的URL?(列出所有用户的朋友)

我在想,在控制器中,这样的东西是合适的:

代码语言:javascript
复制
class User {
    function index() {
        echo 'user index';
    }
}

class Friend extends User {
    function index($user_id) {
        echo 'friend index';
    }    
}

然后,您将得到以下地图:

代码语言:javascript
复制
/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可能是一个更合适的类。

谢谢你的回答:)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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}),因为这是最广泛接受的机制。

票数 2
EN

Stack Overflow用户

发布于 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。

票数 2
EN

Stack Overflow用户

发布于 2009-06-22 22:53:58

你可以做任何一件事或者。问题是当你把两者混合在一起的时候。/user/{ id }/friends和/user/朋友/{id}当某人有“朋友”的id时,这将失败。这似乎是一种琐碎的情况,但使用用户名作为ids是非常流行的。您必须限制每个操作的用户名。

有时你不能做/{controller}/{action}/{id}

一段时间前我做了一个独立音乐网站,我们做了

代码语言:javascript
复制
/artist/{username}
/artist/{username}/albums
/artist/{username}/albums/{album}

我们不想测试条件,所以我们没有

代码语言:javascript
复制
/artist/{username}/{album}

因为我们不想找谁有一张专辑叫“专辑”

我们本可以做到的

代码语言:javascript
复制
/artist/{username}
/artist/{username}/albums
/albums/{album}

但那样的话,我们将失去SEO的优势,有两个艺术家的名字和专辑名称在URL中。此外,在这种情况下,我们将强制专辑名称是唯一的,这将是不好的,因为这是常见的艺术家有相同的专辑名称与其他艺术家。

你可以做纯/{controller}/{action}/{id},但你会失去一些搜索引擎优化,你不能做网址缩短。

代码语言:javascript
复制
/artist/view/{username}
/artist/albums/{username}
/album/view/{album}

回到你的例子。

用户/{id}/朋友/编辑可以工作,但这似乎不合适,因为您永远不应该编辑其他人的好友列表。

在这种情况下,应该是/friends/edit,因为您的用户id是重复的信息,假设您在会话中使用。通常,您希望支持URL缩短,而不是URL扩展。

(额外的问题)我也不会使用休息DELETE /photo?id={id}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1029555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档