web-dev-qa-db-ja.com

symfony-inject doctrineリポジトリのサービス

Symfony2のサービスにリポジトリを挿入する方法 のように

acme.custom_repository:
    class: Doctrine\ORM\EntityRepository
    factory: ['@doctrine.orm.entity_manager', getRepository]
    arguments:
        - 'Acme\FileBundle\Model\File'

しかし、私は例外を取得します

無効なサービス「acme.custom_repository」:クラス「EntityManager5aa02de170f88_546a8d27f194334ee012bfe64f629947b07e4919__CG __\Doctrine\ORM\EntityManager」は存在しません。

Symfony 3.4でこれを行うにはどうすればよいですか?

更新:

EntityClassは、実際には有効なクラスFQCN(確かにphpstormのコピー参照も使用)で、会社名が含まれているため名前を変更しただけです:)。とにかくそれを更新しました。

解決

BlueMの solution は完全に機能します。自動配線を使用していない場合のサービス定義は次のとおりです。

Acme\AcmeBundle\Respository\MyEntityRepository:
    arguments:
        - '@Doctrine\Common\Persistence\ManagerRegistry'
        - Acme\AcmeBundle\Model\MyEntity # '%my_entity_class_parameter%'
9
Brucie Alpha

Symfony 3.4を使用しているので、ServiceEntityRepositoryを使用するはるかに簡単なアプローチを使用できます。単純にリポジトリを実装し、extend class ServiceEntityRepositoryにして、単純にインジェクトでき​​ます。 (少なくとも自動配線を使用する場合– classicこれを従来のDI構成では使用していませんが、動作するはずだと思います。)

言い換えると:

namespace App\Repository;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;

class ExampleRepository extends ServiceEntityRepository
{
    /**
     * @param ManagerRegistry $managerRegistry
     */
    public function __construct(ManagerRegistry $managerRegistry)
    {
        parent::__construct($managerRegistry, YourEntity::class);
    }
}

これで、DI構成なしで、コントローラーメソッドを含め、必要な場所にリポジトリを挿入できます。

1つの注意点(リポジトリをインジェクトしようとする方法にも同様に適用されます):Doctrine接続がリセットされると、古いリポジトリへの参照ができます。しかし、これはリスクです同意します。そうしないと、リポジトリを直接インジェクトでき​​ません。

20
BlueM

例として、引数が有効なクラス(FQCNまたはバンドルの単純化)であることを確認します。

acme.custom_repository:
    class: Doctrine\ORM\EntityRepository
    factory: 
        - '@doctrine.orm.entity_manager'
        - getRepository
    arguments:
        - Acme\MainBundle\Entity\MyEntity

または

acme.custom_repository:
    class: Doctrine\ORM\EntityRepository
    factory: 
        - '@doctrine.orm.entity_manager'
        - getRepository
    arguments:
        - AcmeMainBundle:MyEntity

この助けを願っています

3
Matteo

カスタムリポジトリを適切に作成する

最初に、Doctrineからデフォルトのリポジトリを拡張するリポジトリカスタムクラスを作成する必要があります。

use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
   // your own methods
}

次に、エンティティクラスでこのアノテーションが必要です。

/**
 * @ORM\Entity(repositoryClass="MyDomain\Model\UserRepository")
 */

次に、.ymlファイルでリポジトリを定義します。

custom_repository:
        class: MyDomain\Model\UserRepository
        factory: ["@doctrine", getRepository]
        arguments:
          - Acme\FileBundle\Model\File

リポジトリの定義でclassDoctrine\ORM\EntityRepositoryではなく、カスタムリポジトリクラスを指していることを確認してください。

カスタムリポジトリにカスタムサービスを挿入します。

カスタムリポジトリで、サービスのカスタムセッターを作成します

doctrine\ORM\EntityRepositoryを使用してください。

class UserRepository extends EntityRepository
{
    protected $paginator;

    public function setPaginator(PaginatorInterface $paginator)
    {
        $this->paginator = $paginator;
    }
}

次に、次のようにそれらを注入します。

custom_repository:
        class: MyDomain\Model\UserRepository

        factory: ["@doctrine", getRepository]
        arguments:
          - Acme\FileBundle\Model\File
        calls:
          - [setPaginator, ['@knp_paginator']]

リポジトリをサービスに挿入します。

my_custom_service:
    class: Acme\FileBundle\Services\CustomService
    arguments:
        - "@custom_repository"
0
etudor