1

ルーティング時に、いくつかのクエリ パラメータが存在し、数値であることを確認するにはどうすればよいですか?
たとえば、ルートは次のとおりです。

'route' => array(
    'type' => 'literal',
    'options' => array(
        'route' => '/simple_route',
        'defaults' => array(
            'controller' => 'Application\Controller\IndexController',
            'action' => 'simpleRoute'
        )
    ),
),  

クエリ パラメータが存在し、数値であることvar1を確認するにはどうすればよいですか? var2存在しない場合-routematchでそれらをデフォルトに設定するにはどうすればよいですか?

これはうまくいくはずです:

/simple_route?var1=10&var2=15

そしてこれはうまくいくはずです:

/simple_route?var1=20&var2=352

ただし、数値でない場合 - var2 は数値のデフォルトに設定する必要があります。

/simple_route?var1=10&var2=aabbcc
4

2 に答える 2

2

クエリ パラメーターはルーティング メカニズムの一部ではなく、ルーターによって無視されるため、ルーター構成で制約を設定することはできません。アクション内でクエリ パラメータが正しいかどうかを確認できます。すなわち

public function myAction()
{
    $var1 = $this->getRequest()->getQuery('var1');
    if ($var1 === null || !is_numeric($var1)) {
        throw new \InvalidArgumentException('var1 is invalid');
    }
}

編集:

確かにクエリルートがあるようですが、パラメーターに制約を追加する可能性はありません。したがって、パラメーターを検証するための私の解決策はまだ正しいです。

于 2013-02-28T22:09:50.687 に答える
0

クエリ ルートはセキュリティ上の理由から非推奨であり、使用しないでください (また、実際には何にも一致しないため、当面の問題には対処しません)。

TLDR; このパターンは RESTful ではないため、ZF2 の人々はそれを奨励したくありません。代わりに、クエリ パラメータに基づいてリダイレクトするアクションを作成することをお勧めします。私は実際にこのアプローチを置き換えようとしていましたが、元に戻しました。

===

とにかくそれをサポートしたい/必要がある場合は、検索中にこれらの機能を備えたカスタムルートを開発しました。同様のことができます。

残念ながら、落とし穴があります。重要な点は、ルートがパスを使い果たしたときにルートが検索を停止することです。たとえば、login.php?logout=trueのリテラル ルートに uri を送信すると、次のlogin.phpようになります。

  • login.php に一致
  • 一致する道が残っていないことに気づき、
  • 検索を停止します (たとえ $may_terminate が false に設定されていても)

これは、一致する可能性がまったくない QueryFilter に到達しないことを意味しlogout=trueます。この問題を克服するために私が見つけた最善の方法は、キャラクターを除外することです。たとえば、Literalは一致する必要login.phのある最終的なものを残しp、QueryFilter の検索と一致を続行します。これは醜いですが、うまくいきます。

使用しないことにしたとき、QueryFilter を放棄しました。RESTful な反対意見を乗り越えて使用することに決めた場合は、いくつかのアップグレードをお勧めします。

  • patternexistsを使用して置き換えます。これにより、クエリ文字列に特定の. containsparam => booltruefalseparam
  • array_key_existsセクションにロジックを追加しconstraintsます。

OP の状況は、 のようなルールとのようなcontainsルールを組み合わせることで対処できます。var1 => trueconstraintsvar1 => '[0-9]+'

于 2015-04-06T18:05:42.340 に答える