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%'
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接続がリセットされると、古いリポジトリへの参照ができます。しかし、これはリスクです同意します。そうしないと、リポジトリを直接インジェクトできません。
例として、引数が有効なクラス(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
この助けを願っています
最初に、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
リポジトリの定義でclass
がDoctrine\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"