4

このクックブック レシピを使用して Symfon 2.1 にデータ トランスフォーマーを追加していますが、次のエラーが発生します。The option "em" does not exist. Known options are: "attr", "block_name",....

これは、エンティティ マネージャをフォーム タイプに送信する有効な方法ですか?

$taskForm = $this->createForm(new TaskType(), $task, array(
    'em' => $this->getDoctrine()->getEntityManager(),
));
4

3 に答える 3

9

最初の単純な (依存性注入なしの) Transformer のクックブック レシピを機能させるには、既知のオプションとして "em" を追加する必要があります。setRequired()次のようなメソッドを使用して、フォームのタイプ クラス (クックブックの場合は TaskType) に追加できます。

class TaskType extends AbstractType {
    //...
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {   
        //...other stuff like $resolver->setDefaults(... if you need it

        $resolver->setRequired(array('em'));
    }
}

$resolver->setDefaults() で 'em' を追加することもできますが、このクックブックの場合、エンティティ マネージャーが必要なため、setRequired() を使用する方がよいようです。

于 2012-11-07T14:03:58.830 に答える
4

それが最善の方法であるかどうかについてコメントすることはできませんが、私は常にそれらをハード依存関係としてタスク コンストラクターに渡してきました...

サービス

services:
    my_bundle.form.type.task:
        class: Company\MyBundle\Form\Type\TaskType
        arguments:
            - @doctrine.orm.entity_manager

コントローラ

$form = $this->createForm($this->get('my_bundle.form.type.task'), $task);
// or
$form = $this->createForm(new TaskType($this->getDoctrine()->getEntityManager()));

フォームタイプ

namespace Company\MyBundle\Form\Type;

use Doctrine\ORM\EntityManager;
use Symfony\Component\Form\AbstractType;
// ...

class TaskType extends AbstractType
{
    protected $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    // ...
}

フォーム タイプに依存関係があるとすぐに、コンテナーを使用してそれらを管理します。個人的には、この方法の方が、Symfony の複雑なフォーム構成に頼るよりも、何が起こっているのか、カスタム クラスが何を必要としているのかをより明確に理解していると思います。

于 2012-07-25T16:44:30.297 に答える