处理CakePHP中的别名URL

时间:2009-06-02 15:50:59

标签: cakephp routes

我在cakephp中重写我们公司的网站,需要找到一种方法来执行以下操作:

  1. 用户使用一个进入我们的网站 促销别名URLS 已经为特定的预生成 媒体广告(杂志,网络 促销等)
  2. 根据a检查网址 别名URL的数据库,如果是 别名存在,然后是特定的 跟踪代码写入 会话。
  3. 我考虑过几个选项,但这些选项似乎都不适用于此目的。他们是:

    1. 将查找脚本放入 在appcontroller中的beforeFilter(),所以 它包括在每一个 控制器。 (写一个会话值 所以它只执行一次。)
      • 此选项仅适用于现有控制器,并提供 蛋糕'缺少控制器'错误如果a 网址不存在。
    2. 每个别名的具体路由 Routes.php - 工作但有 可能有数百个别名网址 通过管理员定期添加/删除 接口
    3. 将所有网站网址路由到自己的网址 行动,并拥有'一切 else'规则,对于别名URL 映射到我的查找脚本。 - 乱 我失去了内置的蛋糕 路由。
    4. 自定义404. - 我不想 像我一样,为这些网址返回404 除非他们感觉不好 真的没有映射到任何东西。
    5. 我真的可以在应用程序流程中找到一个可以放置此查找/跟踪脚本的地方,而且我很擅长蛋糕,所以我很难过。

      编辑:另外,我知道一个名为'promo'的子文件夹很容易做到这一点,但是我的旧网站有很多遗留的URL,也需要处理。

2 个答案:

答案 0 :(得分:5)

注意:我假设您的促销网址采用“domain.com/advert-259”或其他类似的形式(即没有“domain.com/adverts/ advert-259')。那太简单了:)

希望你可以使用一些正则表达式的路由。将其添加到/config/routes.php并告诉我是否有不同的正则表达式有用:)

$controllers = Configure::listObjects('controller');

foreach ($controllers as &$value)
{
    $value = Inflector::underscore($value);
}

Router::connect('/:promo', array('controller' => 'promos', 'action' => 'process'), array('promo' => '(?!('.implode('|', $controllers).')\W+)[a-zA-Z\-_]+/?$'));

现在,您可以在PromosController::process()处理所有促销代码。

基本上,它检查url中的促销代码,排除 $ controllers数组中的那些(即常规路由不会搞砸)。

稍后您可能需要考虑根据应用的速度和要求来缓存Configure::listObjects()的值。

答案 1 :(得分:1)

一个非常有趣的问题。我想我会使用第3项。这不是 凌乱 - 毕竟,这通常是由我的东西中的页面控制器处理的。这就是我处理它的方法 - 在routes.php中将你的路由硬编码到你的控制器,然后有一个适用于你的促销代码的matchall路由。这允许你保留遗留的URL,以及使用很多标准的蛋糕东西(你可能只需要明确说明你的每个控制器路由,而不是这样的苦差事...)另外,它会让你做一些有404错误的很酷的东西 - 你可以在那里设置一些逻辑来试图找出他们想去的地方,这样你就可以超级强化你的404.