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 のドキュメントに答えがあります。
これがすべて役立つことを願っています。