【问题标题】:Dealing with Alias URLs in CakePHP在 CakePHP 中处理别名 URL
【发布时间】:2009-06-02 15:50:59
【问题描述】:

我正在用 cakephp 重写我们公司的网站,需要想办法做到以下几点:

  1. 用户通过使用一个 的促销别名 URL 已为特定的预生成 媒体广告(杂志、网络 促销等)
  2. 根据 别名 URL 的数据库,如果 别名存在,那么一个特定的 跟踪代码被写入 会议。

我考虑了几个选项,但似乎没有一个适合此目的。它们是:

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

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

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

【问题讨论】:

    标签: cakephp routes


    【解决方案1】:

    注意:我假设您的促销网址是“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() 的值,具体取决于您的应用速度和您的要求。

    【讨论】:

    • 感谢莱克特博士。在我认为的路线上,我有一些阅读要做。同时尽量不要杀死任何人。
    【解决方案2】:

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

    【讨论】:

    • 你不必说明每个控制器的路由,你只需要说明每个控制器 - 比如'/my_controller/:action/'
    • gnud,你能发布一个示例路线吗?我不确定那种语法。谢谢。
    • 试试 Router::connect('/mycontroller/:action/*', array('controller' =>'mycontroller'));请记住,现在您必须为要启动的路由指定一个操作,只是转到 /mycontroller/ 将不起作用(IIRC)
    • 非常感谢!我需要为页面控制器做同样的事情吗?
    猜你喜欢
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多