使用命名参数进行路由

时间:2013-06-27 11:57:11

标签: cakephp parameters routing routes named

我有一个包含命名参数的网址,我想将其映射到更友好的用户界面。

例如,请使用以下网址:

/视频/索引/排序:发布/方向:降序

我想将此映射到更友好的网址,例如:

/视频/最近

我已尝试在路由器中进行设置,但它不起作用。

来自路由器的代码示例:

Router::connect(
    '/videos/recent/*',
    array('controller' => 'videos', 'action' => 'index'),
    array('sort' => 'published', 'direction' => 'desc'
));

哪个不起作用。以下也不起作用:

Router::connect(
    '/videos/recent/*',
    array('controller' => 'videos', 'action' => 'index', 'sort' => 'published', 'direction' => 'desc'));

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

使用get args

使路由工作的最简单方法是一起避免命名参数。使用appropriate config

可以轻松实现分页
class FoosController extends AppController {

    public $components = array(
        'Paginator' => array(
            'paramType' => 'querystring'
        )
    );
}

以这种方式加载/videos/recent时,您会发现它包含以下格式的网址:

/videos/recent?page=2
/videos/recent?page=3

而不是(由于路线不匹配)

/videos/index/sort:published/direction:desc/page:2
/videos/index/sort:published/direction:desc/page:3

但是如果你真的想使用命名args

您需要更新路线定义 - 路线配置中没有页面:

Router::connect(
    '/videos/recent/*',
    array(
        'controller' => 'videos', 
        'action' => 'index', 
        'sort' => 'published', 
        'direction' => 'desc'
     )
);

因此,如果有一个名为parameter的页面(将由paginator helper生成的所有url),则路由将不匹配。您应该能够通过将page添加到路由定义来解决此问题:

Router::connect(
    '/videos/recent/*',
    array(
        'controller' => 'videos', 
        'action' => 'index', 
        'sort' => 'published', 
        'direction' => 'desc',
        'page' => 1
     )
);

虽然它有效但你可能会发现它很脆弱。

答案 1 :(得分:0)

让我们看一下[Router :: connect documentation](路由是一种将请求URL连接到应用程序中的对象的方式)

  

路由是一种将请求网址连接到应用程序中的对象的方法

因此,它是将URL映射到对象而不是url到url。

您有两个选择:

使用Router :: redirect

类似的东西:

Router::redirect( '/videos/recent/*', '/videos/index/sort:published/direction:desc');

但似乎并不是你想要的

使用Router :: connect

使用普通的Router :: connect,它会将url连接到一些具有适当范围的动作。这样的事情:

Router::connect(
    '/videos/recent/*',
    array(
        'controller' => 'videos', 
        'action' => 'recent'
     )
);

和在VideosController中

public function recent() {
    $this->request->named['sort'] = 'published';
    $this->request->named['direction'] = 'desc';
    $this->index();
}

它有效,我看到了这样的用法,但不确定,那也会让你满意。

至于我,我喜欢普通命名的cakephp参数。如果此范围(已发布和desc)是您的默认状态,则只需在索引操作中编写默认状态。对于过度的情况,我认为使用普通的命名参数是正常的。