php - CakePHP 递归实现漂亮的路由 - 类别、主题、部分、小节等

标签 php mysql database cakephp cakephp-2.0

首先,对于这个问题的长度,我深表歉意。我想让它尽可能详细。

我正在使用 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/Cookedhttp://www.mysite.com/KnowledgeBase/Cats/Grooming它将把它们放在正确的页面上,由正确的 Controller 处理(在这两个示例中分别为 subsectionstopics)。

这是我有点卡住的地方。此数据需要验证。将来我很可能会设置一些主题/部分/小节具有相同名称的东西。使用简单的 $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 的类别中(而不是 CatsLeopardsArmadillosDolphins ...我离题了)。

这样做的最佳方法是什么?到目前为止,我可以看到两个可能的选择:

  1. 将所有这些 URL 路由到一个特定的 Controller (例如无所不知的 KnowledgeBaseController )并使用 recursive => 3 处理那里的一切根据请求的数据调用。
  2. 单独处理这些信息,以便我的 SubsectionsController设置为 recursive => -3并确保数据具有有效的父级。
  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/

相关文章:

php - Doctrine 2.0/一对多 : Many-To-One

php - 动态插入php mysql和性能

database-design - 创建索引,还是添加到主键并创建新表?

php - 按行合并两个不同的表

php - 从 Zend Framework 1 迁移到 Zend Framework 2

php - 在 Capistrano 任务中引用当前服务器

MySQL:为用户统计选票

php - DATE_FORMAT(库存日期时间 ,'%Y-%m-%d')

java - mysql数据库中特定列增量

php - 连接表时出现问题