3

キャッシュすべきではないフォームを含むキャッシュされたサイトがあります。それにはESIを使用します。フォームが送信されると、コントローラーで POST パラメーターを取得する必要があります。Symfony では、実際の POST データではなく、リクエスト パラメータの「フォーム」を取得できます。または、それらを取得する良い方法はありますか。

{{ render_esi(controller('MyBundle:Form:staticForm', {'form': 'sidebar'}))}}

親ページキャッシュのため、小枝でそれらを設定しても機能しません。

{{ render_esi(controller('MyBundle:Form:staticForm', {'form': 'sidebar', 'request': }))}}

コントローラーで post パラメーターを取得する方法 現在、ここに示すコードは ESI データのみを取得します。

public function staticFormAction(Request $request) {
    // ..
    $form->handleRequest($request);// will not work because:
    $request->get('firstName'); // is empty when called by ESI

親リクエストからパラメータを取得するにはどうすればよいですか?

ハッキーなソリューション

現在、私が見つけた唯一の解決策は、あまりにもハックな
TWIG です。

{{ render_esi(controller('ClientWebsiteBundle:Form:staticForm', app.request.request.all|merge({'form': 'sidebar'}), app.request.query.all)) }}

PHP:

$data = ($request->get('myFormName'));
if (count($data)) {
    // Forms uses $request->request
    $request->request->set('myFormName', $data);
    $request->setMethod('POST');
}

追加

少し調べてsymfonyのコアコードを調べた後、ESIをPostに変更する必要があるので、私の質問は「GETではなくPOSTメソッドとしてESIを呼び出す方法」です。

解決

投稿されたような requestStack を使用Chris Ticknerすることは、投稿ソリューションのようです。

4

2 に答える 2

3

ESI はエッジ側のインクルードです。つまり、POST データを処理するようには設計されていません。デフォルトでは、Varnish や Symfony の HttpCache カーネルなどのリバース プロキシは、ESI を URL ("/_proxy?_controller=x¶ms=etc")として認識します。これは、アプリから GET することで含まれます。これが、あなたがこれを困難に感じている理由です。

ただし、POST リクエストをキャッシュするプロキシはないため、POST リクエスト中にrequest_stackサービスを使用してマスター リクエストにアクセスできます。

// if POST
$master_request = $this->get('request_stack')->getMasterRequest();
$form->handleRequest($master_request);

Symfony HttpCache を使用している場合、これでうまくいくはずです。

http://api.symfony.com/2.7/Symfony/Component/HttpFoundation/RequestStack.html

于 2015-01-22T03:39:00.527 に答える
1

を使用して完全なフォームデータを取得できます

$data = $form->getData();

または、単一フィールドの場合:

$var = $form->get('yourformfieldname')->getData();

注意: これは Symfony >= 2.3 用であり、2 つの異なる結果が得られます。

  • data-classフォームでオプションが有効になっている場合 (エンティティにバインドされている場合)、フォームによって値が入力されたエンティティ。これにより、オプションのあるフィールドが除外されます'mapping' => false

  • それ以外の場合は、フォームのすべてのフィールドを含む配列

于 2015-01-21T11:09:15.123 に答える