1

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

以以下 URL 为例:

/videos/index/sort:published/direction:desc

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

/视频/最近

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

来自路由器的代码示例:

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'));

有任何想法吗?

4

2 回答 2

0

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

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

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

您有 2 个选项:

使用路由器::重定向

像这样的东西:

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

但似乎这不是你想要的

使用路由器::连接

使用普通的 Router::connect 将 url 连接到一些具有适当范围的操作。像这样的东西:

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

在视频控制器中

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

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

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

于 2013-06-27T16:11:17.020 回答
0

使用获取参数

让路由工作的最简单方法是避免一起使用命名参数。使用适当的配置很容易实现分页:

class FoosController extends AppController {

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

这样,当您加载时,/videos/recent您应该会发现它包含以下形式的 url:

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

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

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

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

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

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

因此,如果有一个名为参数的页面(分页器助手生成的所有 url 都会有该参数),则路由将不匹配。您应该能够通过添加page到路由定义来解决这个问题:

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

尽管即使它有效,但您可能会发现它很脆弱。

于 2013-06-27T13:55:31.800 回答