在CakePHP中路由到虚荣URL

时间:2012-10-29 18:12:34

标签: php cakephp routing routes cakephp-2.1

我想知道是否有一种简单易用的最佳实践方法可以在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

我可以从路由页面连接到数据库吗?这在性能方面不是一个好主意吗?让我知道最好的方法是什么。

1 个答案:

答案 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',
  )
);