98

独自のサービスを作成し、ドクトリンEntityManagerを注入する必要がありますが、それが__construct()サービスで呼び出されていないため、注入が機能しません。

コードと構成は次のとおりです。

<?php

namespace Test\CommonBundle\Services;
use Doctrine\ORM\EntityManager;

class UserService {

    /**
     *
     * @var EntityManager 
     */
    protected $em;

    public function __constructor(EntityManager $entityManager)
    {
        var_dump($entityManager);
        exit(); // I've never saw it happen, looks like constructor never called
        $this->em = $entityManager;
    }

    public function getUser($userId){
       var_dump($this->em ); // outputs null  
    }

}

これがservices.yml私のバンドルです

services:
  test.common.userservice:
    class:  Test\CommonBundle\Services\UserService
    arguments: 
        entityManager: "@doctrine.orm.entity_manager"

その.ymlをconfig.ymlアプリにインポートしました

imports:
    # a few lines skipped, not relevant here, i think
    - { resource: "@TestCommonBundle/Resources/config/services.yml" }

そして、コントローラーでサービスを呼び出すと

    $userservice = $this->get('test.common.userservice');
    $userservice->getUser(123);

オブジェクト(nullではない)を取得しましたが$this->em、UserServiceではnullであり、すでに述べたように、UserServiceのコンストラクターは呼び出されていません。

もう1つ、ControllerとUserServiceは異なるバンドルに含まれています(プロジェクトを整理するために本当に必要です)が、それでも:他のすべては正常に機能します。

$this->get('doctrine.orm.entity_manager')

UserServiceを取得し、有効な(nullではない)EntityManagerオブジェクトを取得するために使用するのと同じコントローラーで。

構成の一部、またはUserServiceとDoctrine構成の間のリンクが欠落しているようです。

4

4 に答える 4

112

クラスのコンストラクターメソッドは__construct()、ではなく呼び出す必要があり__constructor()ます。

public function __construct(EntityManager $entityManager)
{
    $this->em = $entityManager;
}
于 2012-05-03T07:58:43.350 に答える
65

現代の参考のために、Symfony 2.4+では、コンストラクタインジェクションメソッドの引数に名前を付けることはできなくなりました。ドキュメントによると、あなたは渡すでしょう:

services:
    test.common.userservice:
        class:  Test\CommonBundle\Services\UserService
        arguments: [ "@doctrine.orm.entity_manager" ]

そして、それらは引数を介してリストされた順序で利用可能になります(1つ以上ある場合)。

public function __construct(EntityManager $entityManager) {
    $this->em = $entityManager;
}
于 2014-07-22T00:09:30.743 に答える
18

Symfony 3.3の時点で、EntityManagerは減価償却されていることに注意してください。代わりにEntityManagerInterfaceを使用してください。

namespace AppBundle\Service;

use Doctrine\ORM\EntityManagerInterface;

class Someclass {
    protected $em;

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

    public function somefunction() {
        $em = $this->em;
        ...
    }
}
于 2017-08-29T20:22:58.453 に答える
7

2017年とSymfony3.3以降、リポジトリをサービスとして登録でき、そのすべての利点があります。

より一般的な説明については、私の投稿「SymfonyでDoctrineasServiceでリポジトリを使用する方法」を確認してください。


特定のケースでは、チューニングを使用した元のコードは次のようになります。

1.サービスまたはコントローラーで使用する

<?php

namespace Test\CommonBundle\Services;

use Doctrine\ORM\EntityManagerInterface;

class UserService
{
    private $userRepository;

    // use custom repository over direct use of EntityManager
    // see step 2
    public function __constructor(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function getUser($userId)
    {
        return $this->userRepository->find($userId);
    }
}

2.新しいカスタムリポジトリを作成します

<?php

namespace Test\CommonBundle\Repository;

use Doctrine\ORM\EntityManagerInterface;

class UserRepository
{
    private $repository;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->repository = $entityManager->getRepository(UserEntity::class);
    }

    public function find($userId)
    {
        return  $this->repository->find($userId);
    }
}

3.サービスの登録

# app/config/services.yml
services:
    _defaults:
        autowire: true

    Test\CommonBundle\:
       resource: ../../Test/CommonBundle
于 2017-10-21T11:03:19.580 に答える