3

私は Symfony 2.1.3-DEV を使用しており、エンティティを文字列 (何らかの ID) に変換し、フォームが送信されたときに文字列からエンティティに戻そうとしています。クックブックで指定されたトランスフォーマーを使用している場合、問題は同じです: http://symfony.com/doc/master/cookbook/form/data_transformers.html

コントローラーコード:

$task = $entityManager->find('AcmeTaskBundle:Task', $id);
$form = $this->createForm(new TaskType(), $task); // so $task->issue is Issue object

次のエラーが表示されます。

フォームのビュー データはクラス Acme\TaskBundle\Entity\Issue のインスタンスであると予想されますが、(n) 文字列です。このエラーを回避するには、「data_class」オプションを null に設定するか、(n) 文字列を Acme\TaskBundle\Entity\Issue のインスタンスに変換するビュー トランスフォーマーを追加します。

問題は、文字列に変換するトランスフォーマーを既に持っていることです。

からForm.php:

if (null !== $dataClass && !$viewData instanceof $dataClass) {
    throw new FormException(
       //...
    );
}

パラメーター$viewDataのインスタンス (または特定のオブジェクトの推測された型) であるとチェックされるのはなぜですか? data_classビューデータは文字列/配列などであるはずではありませんか? 何か不足していますか?

4

2 に答える 2

6

段階的に掘り下げた後、直面していた問題を見つけました。

ビュー データは、パラメータで指定されたクラスのインスタンスである必要がありdata_classます。トランスフォーマー Object -> string を使用している場合は、data_classパラメーターを に設定する必要がありますnull

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => null,
    ));
}

デフォルトでは、指定された初期データのdata_class結果です。get_classオブジェクトをコントローラーcreateFormまたは対応するフォームクリエーター関数に渡し、デフォルト値がdata_class存在しない場合、指定されたオブジェクトのクラスに設定されます。

それでも、ドキュメントに示されている例は正常に機能します-フォームが内側(別のフォームの内側)の場合、data_class設定されないため、null.

1 つのフィールド (私のトランスフォーマーの場合はテキスト フィールド) からのみフォームを作成することは非常にまれであるため、通常、トランスフォーマーを使用したこのフォームは他のフォーム内にあるため、正常に機能します。

于 2012-12-11T00:04:37.253 に答える