首先,我为这个问题的长度道歉。我想让它尽可能详细。
我正在使用 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 格式都链接到特定的控制器,以便用户可以输入 URL,例如http://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cooked或http://www .mysite.com/KnowledgeBase/Cats/Grooming它将把它们放在正确的页面上,由正确的控制器处理(在这两个示例中subsections
和topics
分别)。
这是我有点卡住的地方。这些数据需要验证。将来我很有可能会设置主题/部分/子部分具有相同名称的东西。$params
如果数据没有经过递归验证,理论上对小节进行简单搜索可能会导致问题。
以我的狗类别为例: http ://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cooked 而不是: http ://www.mysite.com/KnowledgeBase/Dogs/Feeding/Meat/熟的
当我登陆特定的控制器(在这种情况下是我的SubsectionsController
)时,我只需要选择标题为标题的子部分,Cooked
它属于标题类别中Meat
的主题下的部分(而不是,,或......我离题了)。Feeding
Dogs
Cats
Leopards
Armadillos
Dolphins
这样做的最佳方法是什么?到目前为止,我可以看到两个潜在的选择:
- 将所有这些 URL 路由到一个特定的控制器(例如全能控制器)并根据请求的数据
KnowledgeBaseController
使用调用从那里处理所有内容。recursive => 3
- 单独处理此信息,以便将 my
SubsectionsController
设置为recursive => -3
并确保数据具有有效的父级。 - 使用这些选项的混合 - 使用中央
KnowledgeBaseController
通过recursive => X
查找查询验证数据,然后将所有这些信息发送到有问题的单个控制器以查看。
我知道我的代码应该尽可能 DRY,这意味着我应该只使用一个中央控制器来验证 URL $params
。但是,类别、主题、部分、子部分的布局非常不同,我希望它们由它们自己的控制器处理,同时保持这种 URL 格式。解决这个问题的最佳方法是什么?是否有“最佳实践”解决方案?
谢谢。