2

我正在尝试parseExtension在我的应用程序中实现 REST 和类似功能,在 CakePHP 2 上运行。

http://myapp.dev/controller/action.json而不是拥有像我想使用的 URL http://myapp.dev/json/controller/action

这样做的原因是,有时将扩展名放在类似http://myapp.dev/controller/index/show:10/page:2.json.

:type虽然这可以在自定义路由中实现,但我已经有很多自定义路由,并且出于维护原因不想在其中创建每个带有字段的重复项。

理想的做法是将其设置为首先将带有 /json /xml /html 等的任何 url 视为 json、xml、html 等作为扩展名。

虽然前缀路由看起来很适合这个,但它需要新的方法(例如 json_index、html_index 等,我必须将每种格式指定为单独的前缀)。

有什么好的方法可以做到这一点吗?我只是想parseExtensions成为一种parsePrefixes方法。

4

1 回答 1

1

您应该尝试以下操作:

Router::connect('/:ext/', array(':ext'), array('pass' => 'ext'));
Router::connect('/:ext/:controller/*', array(':ext'), array('pass' => 'ext'));
Router::connect('/:ext/:controller/:action/*', array(':ext'), array('pass' => 'ext'));

然后,路由器将在路由参数的“ext”值中传递 :ext 参数。为您的所有规则添加它!

如果要使用传统路由工作,则需要使用自定义 CakeRoute。在您的应用程序文件夹中创建一个文件“/libs/routes/RestRoute.php”,将以下内容添加到其中:

class RestRoutes extends CakeRoute {
    function parse($url) {
        $params = parent::parse($url);

        if (empty($params)) {
            return false;
        }

        if(!in_array($params['ext'], Router::extensions())) {
            return false;
        }

        return $params;
    }
}

在您的 /core/routes.php 中:

App::import('Lib', 'routes/RestRoute');
Router::connect('/:ext/', array(':ext'), array('pass' => 'ext', 'routeClass' => 'RestRoute'));
Router::connect('/:ext/:controller/*', array(':ext'), array('pass' => 'ext', 'routeClass' => 'RestRoute'));
Router::connect('/:ext/:controller/:action/*', array(':ext'), array('pass' => 'ext', 'routeClass' => 'RestRoute'));

因此,当您的自定义路由无法传递 url 时,它会尝试使用默认 url,不带 ext 参数。否则,参数的顺序就不正常了。

也许不是最好的或更清洁的解决方案,但这是一个好的开始。

于 2012-07-16T17:05:00.857 回答