3

私は 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(),
        ));
    }
}

これを行うためにコンストラクター引数を使用すべきではありませんか?

ありがとう

編集: 以下に回答

4

1 に答える 1

6

解決策を見つけました:

コントローラーの「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());
    }
    //.........
}

これにより、他の人が頭を悩ませることがなくなることを願っています。

于 2013-07-05T22:40:24.033 に答える