CakePHP 2.2.4:在路线中使用多个段塞

CakePHP 2.2.4:在路线中使用多个段塞,cakephp,routing,routes,Cakephp,Routing,Routes,我没有看到一条路线上有多个弹头的问题 我有一个叫做“教师”、“课程”和“科目”的表格。每个都有一个名为“快捷方式”的字段 如何从如下url路由和提取正确的Teacher.id、Course.id和Subject.id: 其中“bowlerae”是教师。快捷方式,“grade-5”是课程。快捷方式,“math”是科目。快捷方式 我不知道最初如何路由,如何提取每3个元素的ID(我是在AppController中还是在需要的每个控制器中执行此操作?),以及如何构建与反向路由和分页兼容的链接。此外,字

我没有看到一条路线上有多个弹头的问题

我有一个叫做“教师”、“课程”和“科目”的表格。每个都有一个名为“快捷方式”的字段

如何从如下url路由和提取正确的Teacher.id、Course.id和Subject.id:

其中“bowlerae”是教师。快捷方式,“grade-5”是课程。快捷方式,“math”是科目。快捷方式

我不知道最初如何路由,如何提取每3个元素的ID(我是在AppController中还是在需要的每个控制器中执行此操作?),以及如何构建与反向路由和分页兼容的链接。此外,字段“快捷方式”是否需要为每个表指定唯一的名称,例如“教师”、“课程”、“科目”

现在,我正在我的routes.php中加载3个模型中的每一个,并进行查询以获取每个模型的相应ID(如果URL的这一部分存在),然后将这些值传递给控制器。但正如你所能想象的,它花费了大量的资源

其他问题/关注事项(适用于AD7six和其他)

如果我想要这样的URL

指向教师主页或类似的URL

要指向课程的主页,我会有如下的路线

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')
));
我担心的是,如果有人像

其中,帐户是有效的控制器,但不是有效的教师

学生是有效的控制者,但不是有效的课程

我将如何处理这些情况?我试着像这样使用重定向方法

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
    } 
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

到帐户控制器,但它将其路由到

、正确的帐户控制器和正确的索引操作,但它将“/索引”附加到URL的末尾

按照我现在的路线,它正在尝试访问课程控制器,因此我向课程控制器添加了相同的重定向方法,如

CoursesController.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
    } 
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创建了路由(如果没有教师、课程或科目),但可能它们不正确。

针对db测试所有请求以查看它们是否匹配路由是一个非常糟糕的想法

将逻辑放入控制器中 一种简单的方法是创建管线:

Router::connect('/*', array('controller' => 'x', 'action' => 'y'));
或者更具体一点:

Router::connect(
    '/:teacher/:course/:subject', 
    array('controller' => 'x', 'action' => 'y'),
    array('pass' => array('teacher', 'course', 'subject')
);
并确保先声明您使用的所有其他路线。然后简单地创建一个控制器动作,如下所示:

XController extends AppController {

    public $uses = array('Teacher');

    public function y($tSlug, $cSlug, $sSlug) {
        $teacher = $this->Teacher->findBySlug($tSlug);
        ...
    }

}
限制路由元素 使用可以限制与给定路由元素匹配的内容,例如,如果只有5名教师,则可以通过确保url以其slug开头来防止任何其他url匹配:

Router::connect(
    '/:teacher/:course/:subject', 
    array('controller' => 'x', 'action' => 'y'),
    array(
        'teacher' => 'rita|sue|bob|larry|mo',
        'pass' => array('teacher', 'course', 'subject')
);
如果要从数据库中读取教师的slug-缓存数据库查询,请不要在所有请求中从路由文件中的数据库中读取

把固定的东西放在你的路线上 使用没有固定字符串的路由意味着任何包含3个路径段的url都将与路由匹配-在路由中放置固定内容可能不太容易出错,这样您就可以确保请求实际上是针对教师、课程、科目组合的

i、 e


这就不需要任何“此url与此路由匹配吗?”逻辑——不管是匹配还是不匹配。

尝试实施您的建议,我有一个问题/顾虑,更新了原始问题。现在检查:)我要写的比我想象的多得多。(加上我在工作,所以当有人路过lol时,我会一直最小化屏幕)
我将如何处理这些实例?
-显然你的问题不是你最初问的问题-你需要查看路由的顺序,让你的老师最后一次捕获所有URL,如有必要,首先为所有其他URL定义明确的路由。对于您以前实现的所有请求,都需要与db对话,这是一个非常糟糕的想法。