2013-03-04 2 views
4

Возможно ли иметь неизвестное количество аргументов для запроса на получение?Гибкая динамическая маршрутизация с помощью Silex

Пример, это работает, но не является идеальным.

$app->get('/print/{template}/{arg1}/{arg2}', function ($template, $arg1, $arg2) use ($app)  { 
    $str = $template . " " . $arg1 . " " . $arg2; 
    return $str; 
}) 
->value('template', FALSE) 
->value('arg1', FALSE) 
->value('arg2', FALSE); 

Что мне нужно - это массив аргументов, возвращаемых для чего-либо, введенного после переменной шаблона. Я не вижу более 4 или 5 аргументов, но мне хотелось бы, чтобы это было максимально гибким с самого начала.

В идеале я хотел бы сделать что-то вроде этого,

$app->get('/pdf/{template}/{args[]}', function ($template, $args) use ($app) { 
    $str = $template;; 
    foreach($args as $arg) 
    $str .= " " . $arg; 

    return $str; 
}); 
+0

Я не использую тонкий каркас. – shapeshifter

+0

ohhhh ... ok в любом случае я не думаю, что вы можете передать массив через url –

+0

Я не уверен, что вы понимаете мой вопрос. Поставляемая переменная в контроллере будет массивом да, но вы должны передать URL-адрес, например/print/template/arg/arg/arg/arg или/print/template/arg – shapeshifter

ответ

5

Компонент маршрутизации не поддерживает это из коробки, насколько я знаю.

Я немного искал код и пришел к выводу, что добавить такой маршрут будет сложно. Способ работы маршрута заключается в том, что каждый маршрут регистрируется до того, как выполняется сопоставление, поэтому маршрут должен существовать. Это означает, что не может быть «подстановочный маршрут».

Я не знаю, если вы приняли это во внимание, но вы всегда можете передать как можно больше информации, как вам нравится с помощью «реальных» получить параметры:

/print/template?optional1=arg&optional2=arg

Это позволит решить вашу проблему и будет работать без каких-либо изменений.

Другой способ справиться с этим - зарегистрировать событие до события, самостоятельно посмотреть на запрос и изменить его. Вы могли бы, например, разделить весь URL на /, посмотреть, соответствует ли шаблон вашему ожидаемому формату, а затем поместить все необязательные аргументы в один аргумент со специальным разделителем символов между ними. Я бы не предложил этого, но это возможно.

Другим способом обработки этого является регистрация собственного ControllerCollection, получение фактического запроса и регистрация маршрута, который соответствует фактическому запросу, в случае наличия необязательных аргументов. Думаю, это было бы немного чище.

Одним из способов решения этого может быть интерфейс. Если ваш запрос всегда ставит дополнительные параметры в последний параметр с особым характером между ними, вы могли бы прочитать этот последний параметр, разделить его и работать с этим:

/print/template/arg:arg

Вашим мог бы что-то вроде:

$app->get('/print/{template}/{args}', function ($template, $args) use ($app)  { 
    $args = explode(':', $args); 
    $str = $template . " " . $args[0] . " " . $args[1]; 
    return $str; 
}) 
->value('template', FALSE) 
->value('args', FALSE); 

Я бы выбрал идею 1 или 4, главным образом потому, что 2 и 3 будут сбивать с толку с течением времени и кажутся не очень чистыми.

22

Если вы действительно этого хотите, вы можете легко обойти это ограничение, ослабляя требование к переменной. Вы можете сделать это by using assert:

$app->get('/pdf/{template}/{args}', function ($template, $args) { 
    ... 
}) 
->assert('args', '.*') 
->convert('args', function ($args) { 
    return explode('/', $args); 
}); 

Делая $args регулярное выражение более снисходительными, он будет соответствовать остальной части строки, даже если она включает в себя слэш. Затем преобразователь param разбивает эту согласованную строку на сегменты.

В целом я согласен с предложением @Sgoettschkes использовать аргументы строки запроса для этого.Если вам нужна динамическая маршрутизация с гибкими сегментами, вы делаете что-то не так в большинстве случаев. И строка запроса обычно лучше подходит для этих параметров.

+1

Хороший вариант использования, являющийся универсальным маршрутом, или сопоставление пустого маршрута (без конечной косой черты) на смонтированном контроллере для обработки ошибок самостоятельно. – neemzy

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