私はSymfony2の使い方を学んでおり、読んだドキュメントでは、Symfonyフォームで使用されているすべてのエンティティに空のコンストラクターがあるか、まったくありません。(例)
http://symfony.com/doc/current/book/index.html第12章
http://symfony.com/doc/current/cookbook/doctrine/registration_form.html
作成時に特定の情報を要求するために、コンストラクターをパラメーター化しました。Symfonyのアプローチは、その強制を検証プロセスに任せ、本質的にメタデータアサーションとデータベース制約に依存してオブジェクトが適切に初期化されるようにし、コンストラクター制約を使用して状態を保証しないようです。
考えてみましょう:
Class Employee {
private $id;
private $first;
private $last;
public function __construct($first, $last)
{ .... }
}
...
class DefaultController extends Controller
{
public function newAction(Request $request)
{
$employee = new Employee(); // Obviously not going to work, KABOOM!
$form = $this->createFormBuilder($employee)
->add('last', 'text')
->add('first', 'text')
->add('save', 'submit')
->getForm();
return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
'form' => $form->createView(),
));
}
}
これを行うためにコンストラクター引数を使用するべきではありませんか?
ありがとう
編集:以下に回答
解決策を見つけました:
コントローラの「createForm()」メソッドのAPIを調べたところ、例からは明らかではないものが見つかりました。2番目の引数は必ずしもオブジェクトではないようです。
**Parameters**
string|FormTypeInterface $type The built type of the form
mixed $data The initial data for the form
array $options Options for the form
したがって、エンティティのインスタンスを渡すのではなく、適切なフィールド値を使用して配列を渡すことができます。
$data = array(
'first' => 'John',
'last' => 'Doe',
);
$form = $this->createFormBuilder($data)
->add('first','text')
->add('last', 'text')
->getForm();
もう1つのオプション(より良い場合があります)は、フォームクラスのデフォルトオプションとして空のデータセットを作成することです。こことここの説明
class EmployeeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('first');
$builder->add('last');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'empty_data' => new Employee('John', 'Doe'),
));
}
//......
}
class EmployeeFormController extends Controller
{
public function newAction(Request $request)
{
$form = $this->createForm(new EmployeeType());
}
//.........
}
これが他の人の頭を悩ませるのを防ぐことを願っています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加