2016-10-21 2 views
3

У меня есть маршрут с несколькими параметрами, и я хочу определить значения по умолчанию, когда он пуст. я не нашел что-то похожее на SO ...Symfony 3 - Маршрут с несколькими необязательными параметрами

My Route (YML):

app_product_show_range_tag: 
path: 'list-range{range_id}-tag{tag_id}-{name_slug}/{page}' 
methods: 'GET' 
defaults: 
    _controller: 'AppBundle:Product:showRangeTag' 
    page: 1 
    tag_id: 2 
    range_id: null 
requirements: 
    name_slug: '([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)' 
    tag_id: '\d+' 
    range_id: '\d+' 
    page: '\d+' 

My Controller (начало):

/** 
* Show a range 
* @ParamConverter("productRange", options={ 
"mapping": {"range_id": "productRangeId", "locale": "locale"}, 
"repository_method": "findOneById", 
"map_method_signature" = true 
}) 
*  @ParamConverter("productTag", options={ 
"mapping": {"tag_id": "productTagId", "locale": "locale"}, 
"repository_method": "findOneById", 
"map_method_signature" = true 
}) 
*/ 
public function showRangeTagAction(ProductRange $productRange = null, ProductTag $productTag = null, string $name_slug, int $page) 
{ [...] 

Я не понимаю, что неправильно ... Я определил все значения по умолчанию, контроллер тоже.

Я сделал быстрый демо на URL: https://streamable.com/1paw

Не стесняйтесь спрашивать больше информации!

ответ

1

За то, что я могу видеть ваши требования регулярных выражений являются неправильными или не соответствует тому, что вы пытаетесь сделать на вашем демо

requirements: 
name_slug: '([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)' 
tag_id: '\d+' 
range_id: '\d+' 
page: '\d+' 

\d+ означает, что вы должны обеспечить, по меньшей мере, несколько. Это объясняет код ответа 404, который вы получаете в своей демонстрации. Использование \d* решит это. Вам будет разрешен использовать URL-адрес, который вы вводите.

Еще одна вещь, не имеющая отношения. В PHP вы должны сначала предоставить аргументы без значений по умолчанию, как указано здесь: php manual

Надеюсь, это поможет вам.

+0

Я знаю это, но, например, с номером страницы (другой маршрут), у меня было то же самое, и он работает, SF3 выглядит, если есть несколько страниц или нет. Но когда у меня есть больше опций, ничего не работает. (это нелегко объяснить) – Snow

+0

Привет, только для моего любопытства, если вы попробуете это, что происходит? функция showRangeTagAction общественности ($ продукции Диапазон продукции Диапазон, ProductTag $ productTag, строка $ name_slug, Int $ страница) – Sinelc

+0

Та же ошибка, я уже тестировал – Snow

0

странно, потому что ваш параметр optionnal/{page} отлично работает в вашем примере? И это первый параметр установлен Так что попробуйте это, и изменить параметр порядка, может быть ...

defaults: { _controller: 'AppBundle:Product:showRangeTag', page: 1, tag_id: 2, range_id: null} 

удачи

+0

Nop, такой же вопрос :( – Snow

+0

Хамм у вас есть только этот адрес в вашем YML? Может быть, другой URL-адрес конфликтует с вашим url, если она звонит раньше? попытайтесь сместить ваш url сверху в свой yml-файл – Sinelc

Смежные вопросы