маршрутизация — Phalcon PHP: измените URL запроса, прежде чем он будет отправлен

Я ищу способ изменить URL-адрес запроса до его отправки. Например, следующие URL-адреса должны обрабатываться одним и тем же контроллером / действием:

/en/paris
/de/paris
/paris

Я хотел бы захватить код страны, если он присутствует, а затем переписать URL-адрес без него, чтобы контроллеры не имели с ним дело. Я пробовал событие ‘dispatch: beforeDispatchLoop’, но оно не подходит для этого.

Любая идея?

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, я рекомендую вам перехватить код страны как можно раньше, чтобы не нарушать поведение по умолчанию (т.е. нужно написать все маршруты вручную). Один из способов сделать это — установить общий сервис в главном 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;
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]