【发布时间】:2013-03-25 20:28:23
【问题描述】:
我没有看到涉及路线中多个 slug 的问题。
我有一个名为“教师”、“课程”和“科目”的表格。每个都有一个名为“快捷方式”的字段。
如何从如下网址中路由和提取正确的 Teacher.id、Course.id 和 Subject.id:
http://www.domain.com/bowlerae/grade-5/math
其中“bowlerae”是 Teacher.shortcut,“grade-5”是 Course.shortcut,“math”是 Subject.shortcut。
我不确定最初如何路由,如何提取每 3 个元素的 ID(我会在 AppController 中执行此操作还是在我需要的每个单独的控制器中执行此操作?)以及如何构建与反向路由兼容的链接和分页。另外,“shortcut”字段是否需要为每个表具有唯一的名称,例如“teacher_slug”、“course_slug”、“subject_slug”?
现在,我正在将 3 个模型中的每一个加载到我的 routes.php 中并查询以获取每个模型的相应 ID(如果 URL 的该部分存在),然后将这些值传递给控制器。但正如你可以想象的那样,它会耗费大量资源。
其他问题/疑虑(针对 AD7six 和其他人)
如果我想要这样的网址
http://www.domain.com/bowlerae
指向教师的主页,或类似这样的 URL
http://www.domain.com/bowlerae/grade-5
要指向课程的主页,我会有如下路径
Router::connect(
'/:teacher',
array('controller' => 'teachers', 'action' => 'view'),
array(
'teacher' => '[a-z0-9]{1}([a-z0-9\-]{2,}[a-z0-9]{1})?',
'pass' => array('teacher')
));
对于教师,以下对于课程
Router::connect(
'/:teacher/:course',
array('controller' => 'courses', 'action' => 'view'),
array(
'teacher' => '[a-z0-9]{1}([a-z0-9\-]{2,}[a-z0-9]{1})?',
'course' => '[a-z0-9]{1}([a-z0-9\-]{2,}[a-z0-9]{1})?',
'pass' => array('teacher', 'course')
));
我担心的是,如果有人导航到类似的 URL 会怎样?
http://www.domain.com/account 其中 account 是有效的控制器,但不是有效的教师
或
http://www.domain.com/bowlerae/students 其中学生是有效的控制者,但不是有效的课程
我将如何处理这些情况?我尝试使用这样的重定向方法...
TeachersController.php
public function view($tSlug = null) {
$this->Teacher->id = $this->Teacher->findByShortcut($tSlug);
if (!$this->Teacher->exists()) {
$this->Session->setFlash('This teacher does not exist');
$this->redirect(array('controller' => $tSlug));
}
else{
// do this
} // end else if teacher exists
}
我希望它路由以下 URL
http://www.domain.com/account 到帐户控制器,但将其路由到
http://www.domain.com/account/index,正确的帐户控制器和正确的索引操作,但它在 URL 的末尾附加了“/index”。
以我现在的路由方式,它正在尝试访问课程控制器,所以我向课程控制器添加了相同的重定向方法,就像这样......
CoursesController.php
public function view($tSlug = null, $cSlug = null) {
$this->Teacher->id = $this->Teacher->findByShortcut($tSlug);
$this->Course->id = $this->Course->findByShortcut($cSlug);
if (!$this->Teacher->exists()) {
$this->Session->setFlash('This teacher does not exist');
$this->redirect(array('controller' => $tSlug, 'action' => $cSlug));
}
elseif (!$this->Course->exists()) {
$this->Session->setFlash('This course does not exist');
$this->redirect(array('controller' => $tSlug, 'action' => $cSlug));
}
else{
// do this
} // end else if everything is fine
}
很遗憾,我收到一条错误消息,指出重定向永远不会结束。
另外,我已经为这样的 URL 创建了路由(如果没有教师、课程或主题),但它们可能不正确。
【问题讨论】: