Phalcon PHP:在调度之前修改请求URL

时间:2014-12-09 11:58:13

标签: php routing phalcon phalcon-routing

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

/en/paris
/de/paris
/paris

我想捕获国家/地区代码(如果存在),然后在没有它的情况下重写URL,以便控制器不必处理它。我尝试了发送:beforeDispatchLoop'事件,但它没有为此设计接缝。

有什么想法吗?

1 个答案:

答案 0 :(得分: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;
    }
}