处理CakePHP中的别名URL

Chr*_*len 1 routes cakephp

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

  1. 用户使用为特定媒体广告(杂志,网络推广等)预生成的促销别名URL之一进入我们的网站
  2. 将针对别名URL数据库检查URL,如果存在别名,则会将特定跟踪代码写入会话.

我考虑了几个选项,其中没有一个看起来适合这个目的.他们是:

  1. 将查找脚本放在appcontroller中的beforeFilter()中,以便将其包含在每个控制器中.(写一个会话值,使它只执行一次.)
    • 此选项仅适用于现有控制器,如果URL不存在,则会给出Cake'缺少控制器'错误.
  2. Routes.php中每个别名的特定路由 - 可以通过管理界面定期添加/删除数百个别名网址.
  3. 将所有站点URL路由到他们自己的操作,并为映射到我的查找脚本的别名URL设置"其他所有"规则. - 凌乱,我失去了内置的蛋糕路由.
  4. 自定义404. - 我不想为这些网址返回404,因为我觉得这是不好的做法,除非他们真的没有映射到任何东西.

我真的可以在应用程序流,我可以把这个查找/跟踪脚本的地方做的,我是相当新的蛋糕,所以我很为难.

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

dr *_*ter 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\-_]+/?$'));
Run Code Online (Sandbox Code Playgroud)

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

基本上,它检查url中的促销代码,不包括 $ controllers数组中的促销代码(即您的常规路由不会搞砸).

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