Дополнительный региональный маршрут Silex

Возможно, я подхожу к этому неправильно, поэтому я открыт для альтернатив.

Я просто хотел бы сопоставить следующие образцы URL-адресов, используя один маршрут:

/

/welcome
/en/welcome
/fr/welcome

/my/arbitrarily/deep/path
/en/my/arbitrarily/deep/path
/fr/my/arbitrarily/deep/path

так далее

Вот что у меня есть до сих пор:

$app->get('/{_locale}{path}', function (Request $request) use ($app) {
    $path = $request->attributes->get('path');
    // do stuff with path here
})
->value('_locale', 'en')
->assert('_locale','^(en|fr)?$')
->value('path', 'index')
->assert('path', '.*')
->bind('*');

Теперь это работает, как и ожидалось, но когда я пытаюсь использовать ветку path() или url(), мне не удается создать правильный URL-адрес, например: #

on /foo (локаль не указана в URL-адресе, поэтому по умолчанию используется en):

{{ path('*', {path:'foo/bar'}) }}

правильно приведет к

foo/bar

в /fr/foo тот же вызов:

{{ path('*', {path:'foo/bar'}) }}

приводит к

frfoo/bar

Это из-за отсутствия / между {_locale} и {path}, но путем изменения маршрута на:

/{_locale}/{path}

Он перестает соответствовать /foo и соответствует только /en/foo, /fr/foo или //foo.

Я не уверен, куда идти отсюда: с

Я не хотел использовать несколько маршрутов (возможно, один с {_locale} и без него), потому что я не уверен, как это работает с функцией path(), я в основном хочу, чтобы результат path() включал текущую локаль в URL-адресе, если это не «en» (я думаю, это то, к чему я клоню).

Кто-нибудь может мне с этим помочь?

Ваше здоровье

Тоби


person Toby Skinner    schedule 21.05.2013    source источник


Ответы (1)


Объявите маршрут для /{_locale}/{path} и /{path}.

Что касается path() , поскольку вы определили значение _locale по умолчанию для первого маршрута, в ваших представлениях не должно быть никаких проблем.

person mpm    schedule 21.05.2013
comment
Это частично решило проблему, я добавил новый маршрут /{path} без привязки, поэтому функция path() всегда использует маршрут /{_locale}/{path} для генерации URL. Единственная проблема заключается в том, что, поскольку он использует волшебную _locale, когда URL-адрес создается с помощью path(), он всегда включает «en» (т.е. я перехожу к /foo, а все ссылки на странице /en/foo/bar) . Учитывая, что я использую _locale для перевода, похоже, мне может понадобиться вспомогательная функция Twig для обработки этого условного «en», а не с использованием path(). - person Toby Skinner; 22.05.2013
comment
Я программист, я ленивый. Не говорите мне, что я должен делать лишнюю работу: автоматизация — это то, чем мы занимаемся. Эта проблема была решена для Symfony2, я не понимаю, почему это нельзя было сделать и для Silex. - person ChocoDeveloper; 26.08.2013
comment
@ChocoDeveloper, тогда просто ответь на вопрос или обыграй его. Я сделал, а ты нет. - person mpm; 26.08.2013