次のコントローラーコードでSymfony2のログインフォームを使用しています
public function loginAction(Request $request)
{
$user = new SiteUser();
$form = $this->createForm(new LoginType(), $user);
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
$data = $form->getValues();
// Need to do something with the data here
}
return $this->render('GDSiteBundle::header.html.twig', array('form' => $form->createView()));
}
しかし、次の警告が表示されます。
警告:array_replace_recursive()[function.array-replace-recursive]:引数#1は\ vendor\symfony\src\Symfony\Component\Form\Form.php行の配列ではありません593 500内部サーバーエラー-ErrorException
誰かが間違っていることを理解するのを助けてくれますか、どうすれば修正できますか?ありがとう。
更新:twigファイルは次のようなものです。
<div class="form">
{{ form_errors(form) }}
<form action="{{ path('site_user_login') }}" method="POST" {{ form_enctype(form) }}>
<div class="level1">
{{ form_row(form.username) }}
<a href="javascript:void(0)" id="inscription">{% trans %}Registration{% endtrans %}</a>
</div>
<div class="level2">
{{ form_row(form.pwd_hash) }}
<div class="forget_pass"><a href="#" id="frgt">{% trans %}Forgot Password ?{% endtrans %}</a></div>
</div>
<input type="submit" class="submit" name="login" value/>
<div class="clr"></div>
</form>
</div>
ここにフォームのタイプの関数があります
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('username', 'text', array('label' => 'Username : '));
$builder->add('pwd_hash','password', array('label' => 'Password : '));
}
ルートは次のとおりです。
site_user_login:
pattern: /{_locale}/login
defaults: {_controller: GDSiteBundle:SiteUser:login}
単に:
$data = $form->getData();
上記のどれも私にとってはうまくいきませんでした。これは私のために働く:
$username = $form["username"]->getData();
$password = $form["password"]->getData();
役に立てば幸いです。
Symfony 2(より具体的には2.3バージョン)では、次の方法でフィールドのデータを取得できます
$var = $form->get('yourformfieldname')->getData();
または、すべてのデータを送信できます
$data = $form->getData();
ここで、「$ data」はフォームフィールドの値を含む配列です。
Symfony> = 2.3では、以下を使用して単一フィールドの値を取得できます。
$var = $form->get('yourformfieldname')->getData();
一方、次を使用できます。
$data = $form->getData();
BUTこれにより、2つの異なる結果が得られます。
フォームでdata-class
オプションが有効になっている場合(つまり、エンティティにバインドされている場合)、フォームによって値が入力されたエンティティ。これはexclude'mapping' => false
オプションを持つ任意のフィールド
それ以外の場合、すべてのフォームのフィールドを持つ配列
Entityで定義されていないフォームに余分なフィールドがあり、$form->getData()
が機能しない場合、1つの方法は次のようになります。
$request->get("form")["foo"]
または :
$form->get('foo')->getData();
Symfony forms には、2つの異なるタイプの transformers と3つの異なるタイプの基礎データがあります: どの形式でも、3種類のデータは次のとおりです。
モデルデータ
これは、アプリケーションで使用される形式のデータです(例:Issueオブジェクト)。 Form::getData()
またはForm::setData()
を呼び出す場合、「モデル」データを処理しています。
標準データ
これは、データの正規化されたバージョンであり、通常は「モデル」データと同じです(ただし、この例には含まれていません)。一般的に直接使用されることはありません。
データの表示
これは、フォームフィールド自体に入力するために使用される形式です。また、ユーザーがデータを送信する形式でもあります。 Form::submit($data)
を呼び出すと、$ dataは「view」データ形式になります。
2つの異なるタイプのトランスフォーマーは、これらの各タイプのデータとの間の変換に役立ちます。
モデルトランスフォーマー:
transform()
: "モデルデータ" => "ノルムデータ"reverseTransform()
: "ノルムデータ" => "モデルデータ"
トランスフォーマーを見る:
transform()
: "norm data" => "view data"reverseTransform()
: "データの表示" => "標準データ"
どの変圧器が必要かは、状況によって異なります。
ビュートランスフォーマーを使用するには、addViewTransformer()
を呼び出します。
すべてのフォームデータを取得する場合:
$form->getData();
特定のフォームフィールド(たとえば、first_name
)の後にいる場合:
$form->get('first_name')->getData();
これでうまくいきました:
if ($request->getMethod() == 'POST') {
$username = $request->request->get('username');
$password = $request->request->get('password');
// Do something with the post data
}
関数のパラメーターとしてRequest $ requestも必要です!お役に立てれば。
フォームオブジェクトによってバインドおよび検証されたリクエストデータを取得するには、次のコマンドを使用する必要があると思います:
$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.
private function getFormDataArray($form)
{
$data = [];
foreach ( $form as $key => $value) {
$data[$key] = $value->getData();
}
return $data;
}
Symfony 2セキュリティ管理を使用している場合、投稿された値を取得する必要はありません。フォームテンプレートを管理するだけです( documentation を参照)。
Symfony 2セキュリティ管理を使用していない場合は、使用することを強くお勧めします。したくない場合やできない場合は、LoginType
のソースを教えてください。
特定のフィールドのデータを取得するには、
$form->get('fieldName')->getData();
または、すべてのフォームデータ
$form->getData();
ドキュメントへのリンク: https://symfony.com/doc/2.7/forms.html
マップされていないフォームフィールドには、$ form-> get( 'inputName')-> getViewData();を使用します。