0

以下のようにservices.ymlファイルを登録しました:

services:
  PMI.form.users_tasks:
        class: PMI\UserBundle\Form\UsersTasksType
        arguments: 
             EntityManager: "@doctrine.orm.default_entity_manager"

で一覧表示できるphp app/console container:debugので、サービスが適切に登録されていることを意味します。

私の UsersTasksType クラスには、以下のようなものがあります:

class UsersTasksType extends AbstractType
{

    protected $ur;

    public function __construct(EntityManager  $ur )
    {
        $this->setUr($ur);
    }

    // Get and setters
}

依存性注入はEntityManager 、クラス コンストラクターに渡す必要がなくなったことを意味しますか? または何 ?

以下のコードを実行する必要がある場合:

$form   = $this->createForm(new UsersTasksType(), $entity);

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

Catchable Fatal Error: Argument 1 passed to PMI\UserBundle\Form\UsersTasksType::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in C:\wamp\www\PMI_sf2\src\PMI\UserBundle\Controller\UsersTasksController.php on line 74 and defined in C:\wamp\www\PMI_sf2\src\PMI\UserBundle\Form\UsersTasksType.php line 19

そして、私は以下のことをしなければなりません:

$em = $this->container->get('doctrine.orm.entity_manager');
$form   = $this->createForm(new UsersTasksType($em), $entity);

依存性注入の全体的な目的は何でしょうか?

4

1 に答える 1

1

依存性注入は基本的に、1 つのサービス (この場合は UserTasksType) から別のサービス (この場合はエンティティ マネージャー) へのアクセスを許可します。

arguments: 
     EntityManager: "@doctrine.orm.default_entity_manager"

これらの 2 行は、新しい UserTasksType オブジェクトをインスタンス化するときにエンティティ マネージャー サービスがコンストラクターに渡されることを期待するよう Symfony に指示します。

UserTasksType でエンティティ マネージャーを使用していない場合は、コンストラクターにエンティティ マネージャーを挿入する必要はなく、上記の 2 行とUserTasksTypeの__construct()/メソッドを削除できます。setUr()

DIC を理解するのに役立つより良い例は、メールを送信するために特別に作成されたサービス (Swiftmail など) があり、サービスがメールを送信できるように別のサービスにそれを挿入する必要がある場合です。

追加することで

arguments: [ @mailer ]

サービス定義に対して、サービスコンストラクターはメーラーサービスを期待します

__construct ($mailer)
{
    $this->mailer = $mailer;
}

これにより、メールを送信するためのアクセスが許可されます

someFunction()
{
    //do something useful, then send an email using the swift mailer service
    $this->mailer->sendEmail();
}

詳細については、最新の Symfony ドキュメントを参照してください。

http://symfony.com/doc/current/book/service_container.html

于 2012-05-29T04:36:29.060 に答える