1

首先,我为这个问题的长度道歉。我想让它尽可能详细。

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

这是我有点卡住的地方。这些数据需要验证。将来我很有可能会设置主题/部分/子部分具有相同名称的东西。$params如果数据没有经过递归验证,理论上对小节进行简单搜索可能会导致问题。

以我的狗类别为例: http ://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cooked 而不是: http ://www.mysite.com/KnowledgeBase/Dogs/Feeding/Meat/熟的

当我登陆特定的控制器(在这种情况下是我的SubsectionsController)时,我只需要选择标题为标题的子部分,Cooked它属于标题类别中Meat的主题下的部分(而不是,,或......我离题了)。FeedingDogsCatsLeopardsArmadillosDolphins

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

  1. 将所有这些 URL 路由到一个特定的控制器(例如全能控制器)并根据请求的数据KnowledgeBaseController使用调用从那里处理所有内容。recursive => 3
  2. 单独处理此信息,以便将 mySubsectionsController设置为recursive => -3并确保数据具有有效的父级。
  3. 使用这些选项的混合 - 使用中央KnowledgeBaseController通过recursive => X查找查询验证数据,然后将所有这些信息发送到有问题的单个控制器以查看。

我知道我的代码应该尽可能 DRY,这意味着我应该只使用一个中央控制器来验证 URL $params。但是,类别、主题、部分、子部分的布局非常不同,我希望它们由它们自己的控制器处理,同时保持这种 URL 格式。解决这个问题的最佳方法是什么?是否有“最佳实践”解决方案?

谢谢。

4

1 回答 1

2

首先,您列出的路线应该是相反的顺序。最具体的路线在顶部,最通用的路线在底部。

您应该使用选项#2。每个层次结构都由它自己的控制器管理。所以采取例如。在您的层次结构的最低级别 SubSections 中,您将拥有一个 SubSectionsController 并使用适当的递归值在其 SubSection 模型上进行查找以获取它的相关部分、部分的主题等等(顺便说一句,这仍然是递归的 = 3,没有递归 = -3) 这样的东西。因此,这样您就拥有了层次结构的所有记录,并且您可以使用层次结构的相关记录来验证每个 url 片段。$this->request->params将为您的路线的每个路线元素包含一个键。

于 2013-01-23T21:02:59.057 回答