Как перенаправить domain.com/locale/controller в domain.com/controller в Кохане? - PullRequest
1 голос
/ 21 декабря 2011

Я пытаюсь реализовать локализацию на моем сайте. В настоящее время базовый (английский) веб-сайт находится по адресу http://domain.com/controller/action, и я хочу, чтобы каждая локализация была по адресу http://domain.com/locale/controller/action. В основном, если пользователь посещает последний URL-адрес, Kohana будет использовать тот же контроллер и действие, что и для английская версия. В коде я просто поменяю строки.

В настоящее время я попытался добавить следующий маршрут, но это не сработало:

// This is my default route:
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

// This the route for the localizations:
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

При этой настройке, если я зайду http://domain.com/es/controller/action,, я получу ошибку 404. Есть идеи, как мне настроить маршруты, чтобы это работало?

Edit:

Просто чтобы завершить ответ Матино и Джона Химмельмана, если я просто поменяю правила, как это было предложено, это сработает. Тем не менее, маршрут "locale" станет тогда универсальным маршрутом, и вам всегда придется указывать локаль, даже если вам нужен только язык по умолчанию (в моем случае "en" / English) , Чтобы это исправить, вы можете ограничить параметр locale поддерживаемыми вами языками. Например:

Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('locale' => '(fr|zh|en)', 'overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

В этом случае будут поддерживаться только те URL, которые начинаются с "fr", "zh" или "en". Кроме того, неподдерживаемые локали будут возвращать 404 ошибки, а «domain.com/controller/action» будет правильно отображать английскую локаль по умолчанию.

1 Ответ

2 голосов
/ 21 декабря 2011

Kohana применяет маршруты в том порядке, в котором они появляются в вашей начальной загрузке. Вот почему ваш маршрут по умолчанию / catch-all всегда должен определяться последним.

С Маршрутизация КО 3.0 Документ:

Важно понимать, что маршруты совпадают в порядке они добавляются, и как только URL соответствует маршруту, маршрутизация по сути "остановлено" и остальные маршруты никогда не пробуются. Поскольку маршрут по умолчанию соответствует почти всему, включая пустой url, перед ним должны быть новые маршруты.

Как и предполагалось, замена маршрутов решит проблему.

// This the route for the localizations:
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));


// This is my default route:
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));
...