1

私が現在 Apigility で開発している Zend Framework 2 アプリケーションには、address次のアクセス ポイントを提供する resource があります。

GET /address
    id <-- required

PATCH /address
    id <-- required
    street
    zip
    city
    type

わかった。今、私はアイテムを挿入するためのさらなる実装を開始しました:

POST /address
    street
    zip
    city
    type

POST メソッドのコンテキストでidは は必要ないため、必須にすることはできません。問題は、Apigility にはコンテキスト依存のフィールド/フィールドセットがないことです (まだ?)。したがって、POST メソッドを実装するには、すべてのメソッドのidフィールドを作成する必要があります。not-requiredしかし、GET と PATCH でそれらを必須にする必要がありますmanually(方法はまだわかりません)。

  1. Apigility でコンテキスト依存フィールド/フィールドセットを定義することは可能ですか? (単にこのオプションが見つからなかったのかもしれません。)

  2. そうでない場合: これを処理するためにどのアプローチがありますか?

4

1 に答える 1

2

Apigility は、動詞固有のバリデータをサポートしています。ただし、バリデーターは POST、PUT、および PATCH でのみ適用または必要とされます。DELETE と GET はボディを取りません。これは、Apigility が検証をサポートするリクエストの唯一の部分です。

さらに、API のユーザーに ID を提供してもらいたいとは思わないでしょう。これは非常にまれです。POST で示したように、ID が生成される可能性があります。これは、ID が PUT および PATCH に提供されることも意味しますが、ID は URL の一部である必要があります。

例えば:

PUT /address/4

PATCH /address/5

ルートには、/address[/:id] のようなものが必要です。この ID が指定されているかどうかに基づいて、リソース クラスで呼び出されるメソッドが決まります。ID なしの PUT (PUT /address) は replaceList を呼び出し、ID 付きの PUT は update を呼び出します。ID を指定した PATCH は patch メソッドを呼び出します。ID なしで PATCH を使用することは、実際には意味がありません。

URL の値を制限したい場合は、次のように制限セクションをルートのオプションに追加できます。


'router' => array(
        'routes' => array(
            'your-api.rest.address' => array(
                'type' => 'Segment',
                'options' => array(
                    'route' => '/address[/:address_id]',
                    'defaults' => array(
                        'controller' => 'YourApi\V1\Rest\Address\Controller',
                    ),
                    'constraints' => array(
                        'address_id' => '[0-9]+',
                    ),
                ),
            ),
        ),
    ),
)

制約のキーは、ルートの id 変数の名前と一致する必要があります。値は、id の有効な値と一致する正規表現になります。これには正規表現区切り文字を含めません。404を返すようなリクエストを/address/banana行い、リクエストはリソースのコードに入りません。

これが整ったら、フィールド リストから id フィールドを削除することをお勧めします。POST、PUT、および PATCH に同じバリデーターのセットを使用できる可能性があります。動詞に応じてバリデーターがどのように適用されるかを理解することも重要です。

すべての動詞で、フィルターを構成した場合、それらは検証前に指定されたフィールドに適用されます。これは、たとえば、\Zend\Filter\Digits のフィルタを使用している場合、検証の前にすべての非数字が削除されることを意味します。バリデータが \Zend\Validator\Digits のようなものである場合、フィールドに少なくとも 1 つの数字が含まれている限り有効です。

動詞に基づいてバリデーターが適用される方法には、わずかな違いがあります。POST および PUT (URL に id を含む) では、バリデーターで指定されていない追加のフィールドを含めることができます。PATCH では、バリデーターで指定されていないフィールドを送信するとエラーが発生します。

ID のない PUT (replaceList へのルーティング) の場合、予期される本文はオブジェクトの配列になります。

バリデーターに関する最後の注意点は、任意のフィールドにフィルターを適用し、検証に合格した場合、いずれかのメソッドに渡される $data の値は、フィルターが適用されるの値になるということです。Digits フィルターと Digits バリデーターを持つフィールドを使用した前の例に戻ると、次のようなものを送信する{'my_field': '1234banana56'}と、検証に合格しますが、$data の値は 123456 ではなく、1234banana56 になります。フィルタリングされた値を取得したい場合は、次のようにする必要があります。


$filteredData = $this->getInputFilter()->getValues();

これにより、フィルタリングおよび検証されたフィールド値の配列が返されます。バリデーターで指定されていないフィールドは、この配列には返されません。$data がフィルタリングされたデータ値を受け取るように、この動作を構成可能にすることについての話がありましたが、この記事の執筆時点では、それがどのように機能するかです。

さまざまな動詞に基づいてさまざまなバリデーターが必要であることがわかった場合は、https ://apigility.org/documentation/content-validation/advanced のドキュメントに答えがあります。

これがすべて役立つことを願っています。

于 2015-05-14T05:10:53.343 に答える