リクエストの場合PATCH
、Symfony 2.3 (おそらくそれ以前?) は、部分的なモデルの更新をネイティブにサポートしています。以下の説明を参照してください。
非PATCH
リクエスト (例:PUT
およびPOST
) の場合、イベント サブスクライバーを作成して登録し、未送信のデータを元の値に操作するか、カスタム リクエスト ハンドラーを記述して、常にに設定して$form->submit()
メソッドを呼び出すことにより、部分的なデータ バインディングを実行できます。 .$clearMissing
false
PATCH
リクエストによる部分バインディングの処理
Symfony の内部をもう少し掘り下げ、イベント サブスクライバーとフォーム拡張機能について理解を深めた後、私はHttpFoundationRequestHandler
クラスに出くわしました。基本的に、Symfony 2.3 では、$form->submit($request)
開発者はフォームの送信されたデータをバインドするときに を呼び出す代わりに$form->handleRequest($request)
;を呼び出す必要があります。これにより、アタッチされたリクエスト ハンドラーが呼び出されます (デフォルトではHttpFoundationRequestHandler
)。リクエスト ハンドラはいくつかのことを行いますが、最も重要なのは$form->submit()
. リクエストメソッドが、提供されていないフォームデータを値としてバインドしないようにフォームに指示していた場合false
、フォームのメソッドに値を渡します。submit
PATCH
null
Symfony 2.3 でメソッドを使用する際の注意事項がいくつかあります。これPATCH
については、Symfony のドキュメントでさらに説明されています。
Routes で GET および POST 以外の HTTP メソッドを使用する方法:
「残念ながら、ほとんどのブラウザーは PUT および DELETE リクエストの送信をサポートしていないため、人生はそれほど単純ではありません。幸い、Symfony2 は、この制限を回避する簡単な方法を提供します。クエリ文字列に _method パラメーターを含めるか、 HTTP リクエスト、Symfony2 はルートを照合するときにこれをメソッドとして使用します。」
PUT
上記の Symfony のドキュメントからの引用は、ほとんどのブラウザが、PATCH
、またはDELETE
リクエストの送信をサポートしていないことを説明しています。Symfony の部分的なフォーム更新のネイティブ サポートを活用するには、PATCH
リクエストを使用する必要があるため、これは問題です。しかし、Symfony はこれに対する答えを提供します。ドキュメントには、_method
パラメーターまたはフォームの値を使用して、必要な実際のリクエストを偽装できることが示されています。Symfony は、私たちが何を意味するかを正確に認識します。ただし_method
、理解するには、http_method_override
構成オプションを有効にする必要がある場合があります。たとえば、次のようになります。
# config.yml
framework:
http_method_override: true
...
フォームがどのメソッドを使用するべきかを Symfony に伝える他の方法もあり、それらはここにあります:フォームのアクションとメソッドの変更。