9

私の質問:

  1. Symfony 2 は、PATCHリクエストや何らかの部分的なフォーム コンテンツの送信をサポートしていますか? もしそうなら、これを行うための「正しい」(または、より正確には「好ましい」)方法はありますか?

  2. PRE_BIND(以下を参照) イベント アプローチ以外に、この問題を解決する他のパターンや方法はありますか? この問題を解決する他の方法がある場合、それらのいずれかが他の方法よりも優れているか、または劣っていると見なされますか?

これまでに見つけた/実行したこと: Github のプル リクエスト ( #5576 ) によると、Symfony 2 で部分的なフォーム バインディングをサポートする作業が行われました (私の理解では、Symfony 2.2 を対象としています)。ただし、そのプル リクエスト以外に、部分的なフォーム バインディングの使用方法を示すドキュメントや例が見つかりません。

私が見つけた 1 つの解決策は、私の目的に合うかもしれません。アプローチは、イベント サブスクライバーをPRE_BINDフォーム タイプのイベントにアタッチすることです。stackoverflow を大雑把に検索すると、現在使用しているものに似た次の回答が得られました: https://stackoverflow.com/a/11687863/657674

4

1 に答える 1

14

リクエストの場合PATCH、Symfony 2.3 (おそらくそれ以前?) は、部分的なモデルの更新をネイティブにサポートしています。以下の説明を参照してください。

PATCHリクエスト (例:PUTおよびPOST) の場合、イベント サブスクライバーを作成して登録し、未送信のデータを元の値に操作するか、カスタム リクエスト ハンドラーを記述して、常にに設定して$form->submit()メソッドを呼び出すことにより、部分的なデータ バインディングを実行できます。 .$clearMissingfalse

PATCHリクエストによる部分バインディングの処理

Symfony の内部をもう少し掘り下げ、イベント サブスクライバーとフォーム拡張機能について理解を深めた後、私はHttpFoundationRequestHandlerクラスに出くわしました。基本的に、Symfony 2.3 では、$form->submit($request)開発者はフォームの送信されたデータをバインドするときに を呼び出す代わりに$form->handleRequest($request);を呼び出す必要があります。これにより、アタッチされたリクエスト ハンドラーが呼び出されます (デフォルトではHttpFoundationRequestHandler)。リクエスト ハンドラはいくつかのことを行いますが、最も重要なのは$form->submit(). リクエストメソッドが、提供されていないフォームデータを値としてバインドしないようにフォームに指示していた場合false、フォームのメソッドに値を渡します。submitPATCHnull

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 に伝える他の方法もあり、それらはここにあります:フォームのアクションとメソッドの変更

于 2013-11-08T19:31:47.517 に答える