-->

灵活的动态路由与Silex的(Flexible dynamic routing with Silex

2019-07-20 21:51发布

是否有可能有一个GET请求的参数数目未知的?

例如,这工作,但效果不理想。

$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;
});

Answer 1:

路由组件不支持此开箱即用,据我所知。

我看着代码了一下,得出的结论是加入这样的路线将是困难的。 路由的工作方式是匹配完成之前每个路由被注册,所以路由必须存在。 这意味着不可能有一个“通配符路线”。

我不知道,如果你把这个考虑进去,但是你通过“真正”得到的参数喜欢你总是可以传递尽可能多的信息:

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

这将解决您的问题,没有任何修改会工作。

你可以处理这个问题的另一种方式是由注册前的事件,看着自己的请求,并修改它。 例如,您可以通过/分割整个网址,看看图案的预期的格式相匹配,然后把所有的可选参数为一个参数之间用特殊字符间隔。 我不建议这一点,但它是可能的。

处理这个另一种方式是通过注册自己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将随着时间的推移很混乱,似乎不是很干净。



Answer 2:

如果你真的想,你可以很容易地通过放宽对变量的要求解决此限制。 你可以做, 通过使用assert

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

通过使$args正则表达式更加宽容,它会匹配字符串的休息,即使它包括斜线。 帕拉姆转换器则分裂匹配串入段。

总的来说,我同意@Sgoettschkes的建议,使用查询字符串参数此。 如果您需要柔性链段高度动态路由,你所做的是错在大多数情况下。 和查询字符串通常是为那些PARAMS的更合适。



文章来源: Flexible dynamic routing with Silex