1

我想知道是否有一种简单的最佳实践方法可以在 CakePHP(routes.php 文件)中创建路由以将用户 ID 映射到虚 url?

我的路线页面中有(可怕的方法)以下测试代码:

$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

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

4

1 回答 1

4

您可以创建一个自定义路由类,它将在数据库中查找传递的 url 并将它们转换为正确的用户 ID。设置较长的缓存时间应该可以减轻命中数据库的任何性能影响。

然而,这本书的文档有点薄,但基本结构是这样的:

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',
  )
);
于 2012-10-29T18:40:41.570 回答