【问题标题】:Phalcon PHP: Modify a request URL before it gets dispatchedPhalcon PHP:在发送请求之前修改请求 URL
【发布时间】:2015-02-07 07:33:51
【问题描述】:

我正在寻找一种在请求 URL 被分派之前对其进行修改的方法。例如,以下 URL 应由相同的控制器/操作处理:

/en/paris
/de/paris
/paris

如果存在国家代码,我想捕获它,然后在没有它的情况下重写 URL,以便控制器不必处理它。我尝试了“dispatch:beforeDispatchLoop”事件,但它并没有为此设计。

有什么想法吗?

【问题讨论】:

  • 我认为我不能使用.htaccess,我需要根据一组数据检查该值。
  • 将所有请求发送到一个文件,并解析您发送的内容。
  • 您所描述的内容听起来像是在 Phalcon 或任何其他框架中已经发生的事情。使用 Phalcon 功能的最佳方法是什么?因为当 'dispatch:beforeDispatchLoop' 被触发时,看起来路由已经被提供给调度程序。在纯 PHP 中,我只需替换 $_SERVER['REQUEST_URI'] 或其他东西。

标签: php routing phalcon phalcon-routing


【解决方案1】:

如果您可以约定所有国家/地区代码在路径中排在第一位,那么附加的重写规则可能会对您有所帮助:

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([a-z]{2})/(.*)$ index.php?_lang=$1&_url=/$2 [QSA,L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

编辑

如果您确实需要在 PHP 中执行此操作,我建议您尽早截取国家/地区代码,以免破坏 default routing behavior(即需要手动编写所有路由)。一种方法是在主 DI 中设置共享服务来替换默认的'router' 服务。自定义路由器仅包含在 Phalcon\Mvc\Router 的子级中,其中 getRewriteUri 方法被覆盖,可以执行任何您想要的操作,它们只返回不带国家/地区代码部分的 URI:

namespace MyApp\Services;

use Phalcon\Mvc\Router as PhRouter;

class Router extends PhRouter
{
    public function getRewriteUri()
    {
        $originalUri = parent::getRewriteUri();

        // Now you can:
        // Check if a country code has been sent and extract it
        // Store locale configurations to be used later
        // Remove the country code from the URI

        return $newUri;
    }
}

【讨论】:

  • 感谢您的代码,我对其进行了编辑以修复条件/规则。这很好,但我仍然想在 PHP 中做到这一点。没有解决办法吗?我试图修改 $_SERVER,但 Phalcon 必须以神秘的方式访问它,因为当我丢弃它时,它没有任何区别。
  • 谢谢,这个 getRewriteUri() 看起来很不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
相关资源
最近更新 更多