CakePHP 1.3中非模型请求的更好解决方案

时间:2010-12-02 01:01:24

标签: cakephp cakephp-1.3

有一些参数没有中继模型。

Router::connect("/ctrl/action/:mode/:year"      ,
    array('controller' => 'ctrl', 'action' => 'action'),
    array('mode' => 'modea|modeb', 'year' => '[12][0-9]{3}'));

如何验证和消毒?

我应该创建虚拟模型吗? 或在组件上实施?

1 个答案:

答案 0 :(得分:1)

嗯,您当前的路线与/ctrl/action/modea/5010不匹配,因此它将落入另一条路线,很可能是标准路线,它会将请求发送至Ctrl_controller::action('modea', 5010)。即你基本上有相同的结果。

最好的办法可能就是跳过这条路线,因为它并没有真正地路由任何它不会去的地方。在使用值之前,只需在控制器操作中进行验证:

function action($mode, $year) {
    if (!in_array($mode, array('modea', 'modeb')) || $year < 1900 || 3000 < $year) {
        $this->cakeError('error404');
    }
    ... business as usual ...
}

或者:

function action($mode, $year) {
    switch ($mode) {
        case 'modea' :
            ...
            break;
        case 'modeb' :
            ...
            break;
        default :
            $this->cakeError('error404');
    }
}

或其某些组合。除非$mode$year变量与您的数据库/模型有任何关系,否则您不希望为其创建模型。模型进行验证,因为这是将内容放入数据库之前的重要步骤,但这并不意味着它们是应用程序中唯一可以或应该进行验证的部分。