Я ищу способ изменить URL-адрес запроса до его отправки. Например, следующие URL-адреса должны обрабатываться одним и тем же контроллером / действием:
/en/paris /de/paris /paris
Я хотел бы захватить код страны, если он присутствует, а затем переписать URL-адрес без него, чтобы контроллеры не имели дело с этим. Я попробовал событие «отправка: beforeDispatchLoop», но для этого он не предназначен для создания шва.
Есть идеи?
Если вы можете согласиться с тем, что код всей страны будет первым в пути, возможно, дополнительное правило перезаписи может помочь вам:
<IfModule mod_rewrite.c> RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([az]{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; } }