1

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

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

我考虑了几种选择,但似乎都不适合此目的。他们是:

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

我真的可以在应用程序流程中放置一个可以放置此查找/跟踪脚本的位置,而且我对蛋糕还很陌生,所以我很难过。

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

4

2 回答 2

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()根据应用程序的速度和您的要求缓存 的值。

于 2009-06-03T07:21:36.353 回答
1

一个非常有趣的问题。我想我会使用第 3 项。它并没有那么混乱——毕竟,这通常是由我的东西中的页面控制器处理的。这就是我处理它的方式 - 在 routes.php 中硬编码你的路由到你的控制器,然后有一个 matchall 路由适用于你的促销代码。这使您可以保留旧版 URL,并使用许多标准蛋糕的东西(您可能只需要明确说明每个控制器路由,而不是这样的苦差事……)此外,它还可以让您做一些带有 404 错误的很酷的东西——您可以在其中放置一些逻辑来尝试找出他们试图去哪里,这样您就可以为您的 404 提供超级强大的功能。

于 2009-06-02T18:00:38.720 回答