我正在寻找一种在分派请求之前修改请求网址的方法。例如,以下URL应由同一控制器/操作处理:
/en/paris
/de/paris
/paris
我想捕获国家/地区代码(如果存在),然后在没有它的情况下重写URL,以便控制器不必处理它。我尝试了发送:beforeDispatchLoop'事件,但它没有为此设计接缝。
有什么想法吗?
答案 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;
}
}