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に変換するカスタムルートクラスを作成できます。キャッシュ時間を長く設定すると、DBにアクセスした場合のパフォーマンスへの影響を軽減できます。

本のドキュメントは少し薄いですが、基本的な構造は次のとおりです。

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 に答える