4

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

2 に答える 2

22

本当に必要な場合は、変数の要件を緩和することで、この制限を簡単に回避できます。次を使用assertしてそれを行うことができます:

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

正規表現を$argsより寛容にすることで、スラッシュが含まれていても、文字列の残りの部分と一致します。次に、param コンバーターは、一致した文字列をセグメントに分割します。

In general I agree with @Sgoettschkes' suggestion to use query string arguments for this. If you need highly dynamic routing with flexible segments, you're doing something wrong in most cases. And query string is usually the better fit for those params.

于 2013-03-05T02:16:08.393 に答える
5

私の知る限り、ルーティング コンポーネントはそのままではサポートしていません。

コードを少し調べたところ、そのようなルートを追加するのは難しいという結論に達しました。ルーティングが機能する方法は、マッチングが完了する前に各ルートが登録されるため、ルートが存在する必要があります。これは、「ワイルドカード ルート」が存在できないことを意味します。

これを考慮したかどうかはわかりませんが、「実際の」get パラメータを介していつでも好きなだけ多くの情報を渡すことができます。

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

これで問題が解決し、変更なしで機能します。

これを処理する別の方法は、before イベントを登録し、自分でリクエストを確認して変更することです。たとえば、URL 全体を / で分割し、パターンが予想される形式と一致するかどうかを確認してから、すべてのオプションの引数を間に特殊文字スペーサーを入れて 1 つの引数に入れることができます。これはお勧めしませんが、可能です。

これを処理する別の方法は、独自の ControllerCollection を登録し、実際のリクエストを取得して、オプションの引数がある場合に実際のリクエストに一致するルートを登録することです。これは私が推測する少しきれいになるでしょう。

これを解決する 1 つの方法は、フロントエンドです。リクエストが常に特殊文字を間に挟んで最後のパラメーターに追加のパラメーターを配置する場合、それらの最後のパラメーターを読み取り、分割してそれを操作できます。

/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);

主に、2 と 3 は時間の経過とともに非常に混乱し、あまりきれいではないように見えるため、私はアイデア 1 または 4 を選びます。

于 2013-03-04T12:24:18.190 に答える