首先,对于这个问题的长度,我深表歉意。我想让它尽可能详细。
我正在使用 CakePHP 开发基于 Web 的应用程序。在过去的几周里,我一直在处理几个方面的问题,目前正在用大量信息填充我的数据库表。用户应该可以通过漂亮、用户友好的 URL 轻松访问它。假设我有我的 Users
以及 ACO、ARO 等都已成立。这与这个问题无关。对于这个特定问题,我的数据库的相关方面如下:
类别:总体类别(例如“猫”)
- 每个类别
hasMany
话题
主题:特定主题(例如“喂食”)
- 每个主题
belongsTo
一类 - 每个主题
hasMany
栏目
部分:主题中的部分(例如“肉类”)
- 各科
belongsTo
一个话题 - 各科
hasMany
小节
小节:一个部分中的一个小节(例如,'Cooked')
- 每个小节
belongsTo
一节
等等等等。
我已经在我的 /Config/routes.php
中配置了路由文件以包含以下内容:
Router::connect('/KnowledgeBase', array('controller' => 'categories', 'action' => 'index'));
Router::connect('/KnowledgeBase/:category', array('controller' => 'categories', 'action' => 'view'));
Router::connect('/KnowledgeBase/:category/:topic', array('controller' => 'topics', 'action' => 'view'));
Router::connect('/KnowledgeBase/:category/:topic/:section', array('controller' => 'sections', 'action' => 'view'));
Router::connect('/KnowledgeBase/:category/:topic/:section/:subsection', array('controller' => 'subsections', 'action' => 'view'));
如您所见,每个 URL 格式都链接到一个特定的 Controller ,因此用户可以输入一个 URL,例如 http://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cooked或 http://www.mysite.com/KnowledgeBase/Cats/Grooming它将把它们放在正确的页面上,由正确的 Controller 处理(在这两个示例中分别为 subsections
和 topics
)。
这是我有点卡住的地方。此数据需要验证。将来我很可能会设置一些主题/部分/小节具有相同名称的东西。使用简单的 $params
如果数据未经过递归验证,则理论上搜索该小节可能会导致问题。
以我的“狗”类别为例: http://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cooked 而不是: http://www.mysite.com/KnowledgeBase/Dogs/Feeding/Meat/Cooked
当我登陆特定的 Controller (在本例中是我的 SubsectionsController
)时,我只需要选择标题为 Cooked
的子部分。属于 Meat
主题下的部分 Feeding
在标题为 Dogs
的类别中(而不是 Cats
、 Leopards
、 Armadillos
或 Dolphins
...我离题了)。
这样做的最佳方法是什么?到目前为止,我可以看到两个可能的选择:
- 将所有这些 URL 路由到一个特定的 Controller (例如无所不知的
KnowledgeBaseController
)并使用recursive => 3
处理那里的一切根据请求的数据调用。 - 单独处理这些信息,以便我的
SubsectionsController
设置为recursive => -3
并确保数据具有有效的父级。 - 混合使用这些选项 - 使用中央
KnowledgeBaseController
使用recursive => X
验证数据查找查询,然后将所有这些信息发送给有问题的单个 Controller 以供查看。
我知道我的代码应该尽可能干,这意味着我应该只使用一个中央 Controller 来验证 URL $params
.然而,类别、主题、部分、小节的布局非常不同,我宁愿它们由自己的 Controller 处理,同时保持这种 URL 格式。解决这个问题的最佳方法是什么?是否有“最佳实践”解决方案?
谢谢。
最佳答案
首先,你列出的路线应该是倒序的。最具体的路线在顶部,最通用的路线在底部。
您应该使用选项 #2。层次结构的每个级别都由它自己的 Controller 管理。所以拿例如。在你的层次结构 SubSections 的最底层,你会有一个 SubSectionsController 并在它的 SubSection 模型上找到具有适当递归值以获得它的相关部分,该部分的主题等等(顺便说一句,这仍然是 recursive = 3 ,没有递归 = -3 这样的东西)。因此,通过这种方式,您拥有层次结构的所有记录,并且可以使用层次结构的相关记录验证每个 url 片段。 $this->request->params
将为您的路由的每个路由元素包含一个键。
关于php - CakePHP 递归实现漂亮的路由 - 类别、主题、部分、小节等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14487740/