我想知道是否有一种简单易用的最佳实践方法可以在CakePHP(routes.php文件)中创建路由,将userID映射到虚荣网址?
我的路径页面中有以下测试代码(可怕的方法):
$users = array
(
1 => 'firstname-lastname',
2 => 'firstname2-lastname2'
);
//profiles
foreach($users as $k => $v)
{
// LESSONS (Profiles)
Router::connect('/:user', array('controller' => 'teachers', 'action' => 'contentProfile', $k),
array('user' => '(?i:'.$v.')'));
}
以上代码使用conProfile将我的教师控制器路由为:
mydomain.com/teachers/contentProfile/1
to
mydomain.com/firstname-lastname
我可以从路由页面连接到数据库吗?这在性能方面不是一个好主意吗?让我知道最好的方法是什么。
答案 0 :(得分:4)
您可以创建一个自定义路由类,该类将查找数据库中传递的URL并将其转换为正确的用户ID。设置较长的缓存时间可以减轻命中数据库对性能的影响。
然而,The book documentation有点薄,但基本结构是:
class TeachersRoute extends CakeRoute {
/**
* Modify incoming parameters so that controller receives the correct data
*/
function parse($url) {
$params = parent::parse($url);
// Add / modify parameter information
// The teacher id should be sent as the first value in the $params['pass'] array
return $params;
// Or return false if lookup failed
}
/**
* Modify parameters so calls like HtmlHelper::url() output the correct value
*/
function match($url) {
// modify parameters
// add $url['slug'] if only id provided
return parent::match($url);
}
然后在你的路线中:
Router::connect(
'/:slug',
array(
'controller' => 'teachers',
'action' => 'contentProfile'
),
array(
'slug' => '[a-zA-Z0-9_-]+'
'routeClass' => 'TeachersRoute',
)
);