ここでチュートリアルを読んでいます
https://symfony.com/doc/current/form/csrf_protection.html
csrfトークンを追加する方法。使うように言う
form_end()
テンプレート内。しかし、これは機能していません、エラーが発生します:
タイプエラー:関数の引数が少なすぎますSymfony\Component\Form\FormRenderer :: renderBlock()、0がE:\ projektai\php projektai\htdocs\mokomieji\symfony_4_demo\var\cache\dev\twig\bb\bb2248f7be504240fcc2ab43d4c97ab14dbcc897c229b1cb4cb4cd4cd4cbdbcd4cbdb2c3d4c3c4c4c9ab4d3c0c0c0c0b4b0e0e0e0e0c0d0b0e0b0e0a0f0a0e0e0dに渡されました48行目のphpと少なくとも2つが期待されています
修正方法を示す回答がありますが、フォームオブジェクトを作成した場合のみです。
symfony Type error:関数の引数が少なすぎるためFormRenderer :: renderBlock()
フォームオブジェクトなしでこれを行うにはどうすればよいですか?ログインドキュメントページからのログインは次のとおりです。
{% if error %}
<div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}
<form action="{{ path('login') }}" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="_username" value="{{ last_username }}" />
<label for="password">Password:</label>
<input type="password" id="password" name="_password" />
<button type="submit">Login</button>
{{ form_end() }}
ヘルパーを使用できますtwig function csrf_token
ドキュメントに記載されているように here 、例:
<input type="hidden" name="_csrf_token"
value="{{ csrf_token('authenticate') }}"
>
this 回答でさらにヘルプ。
UPDATE:
その他の戦略:コントローラから渡す:
$tokenProvider = $this->container->get('security.csrf.token_manager');
$token = $tokenProvider->getToken('example')->getValue();
この助けを願っています
{{ form_row(form._token) }}
を使用して、Symfony 3でレンダリングするフォームに必要なCSRFトークンフィールドを生成できます(私は現在、このメソッドをSymfony 3.4で使用しています)。
{{form_end()}}は、次のような場合にのみ機能します。
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
コントローラでカスタムトークンを作成し、次のようにビューに渡すことができます。
$csrf = $this->container->get('security.csrf.token_manager');
$token = $csrf->refreshToken('yourkey');
そして、twigトークンに隠し入力を作成します:
<input type="hidden" name="_token" value="{{ token }}">
正しい_csrf_token
_を取得するには、FormView
を$form->createView()
で作成し、その内部のトークンを使用する必要があります。
_<input type="hidden" name="_token" value="{{ form._token.vars.value }}">
_
他のすべてのソリューションは、変更されない静的文字列の生成に依存しており、csrfトークンの目的に違反しています。