我有一个包含命名参数的网址,我想将其映射到更友好的用户界面。
例如,请使用以下网址:
/视频/索引/排序:发布/方向:降序
我想将此映射到更友好的网址,例如:
/视频/最近
我已尝试在路由器中进行设置,但它不起作用。
来自路由器的代码示例:
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'));
有什么想法吗?
答案 0 :(得分:0)
使路由工作的最简单方法是一起避免命名参数。使用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
您需要更新路线定义 - 路线配置中没有页面:
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( '/videos/recent/*', '/videos/index/sort:published/direction:desc');
但似乎并不是你想要的
使用普通的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)是您的默认状态,则只需在索引操作中编写默认状态。对于过度的情况,我认为使用普通的命名参数是正常的。