Я ищу способ изменить URL-адрес запроса до его отправки. Например, следующие URL-адреса должны обрабатываться одним и тем же контроллером / действием:
/en/paris
/de/paris
/paris
Я хотел бы захватить код страны, если он присутствует, а затем переписать URL-адрес без него, чтобы контроллеры не имели с ним дело. Я пробовал событие ‘dispatch: beforeDispatchLoop’, но оно не подходит для этого.
Любая идея?
Если вы можете договориться, что весь код страны стоит первым в пути, возможно, вам может помочь дополнительное правило перезаписи:
<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, я рекомендую вам перехватить код страны как можно раньше, чтобы не нарушать поведение по умолчанию (т.е. нужно написать все маршруты вручную). Один из способов сделать это — установить общий сервис в главном 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;
}
}
Других решений пока нет …