Symfony生成器生成以下类库:
namespace AppBundle\Repository;
use AppBundle\Entity\GroupEntity;
/**
* GroupEntityRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class GroupEntityRepository extends \Doctrine\ORM\EntityRepository
{
}
Run Code Online (Sandbox Code Playgroud)
services.yml:
group_entity_repository:
class: AppBundle\Repository\GroupEntityRepository
arguments: ["@doctrine.orm.entity_manager", AppBundle\Entity\GroupEntity]
Run Code Online (Sandbox Code Playgroud)
我错误地配置了services.yml,但我现在不知道如何使用第二个参数.所以我得到错误:
可捕获致命错误:传递给Doctrine\ORM\EntityRepository :: __ construct()的参数2必须是Doctrine\ORM\Mapping\ClassMetadata的实例,给定字符串,在E:\ other\dropbox\Dropbox\programavimas\kodo pavyzdziai \中调用第1626行的htdocs\users_admin_demo\var\cache\dev\appDevDebugProjectContainer.php并定义
怎么解决?我在文档中看不到,它只显示了生成器和最终生成的类的代码,但没有显示服务配置.
Tob*_* Xy 17
从Symfony 3.3开始推荐:
从Symfony 3.3开始,建议使用实际的类名作为服务ID(读取此内容和此内容).
AppBundle\Repository\GroupEntityRepository:
factory: 'Doctrine\ORM\EntityManagerInterface:getRepository'
arguments:
- AppBundle\Entity\GroupEntity
Run Code Online (Sandbox Code Playgroud)
原始答案:
您可以像这样配置存储库服务:
group_entity_repository:
class: AppBundle\Repository\GroupEntityRepository
factory: ["@doctrine.orm.entity_manager", getRepository]
arguments:
- AppBundle\Entity\GroupEntity
Run Code Online (Sandbox Code Playgroud)
您可能永远不想自己调用存储库构造函数.因此,这种方法只使用entity_manager来获取存储库.服务容器基本上使用此代码来获取存储库:
$container->get('doctrine.orm.entity_manager')->getRepository('AppBundle\Entity\GroupEntity');
Run Code Online (Sandbox Code Playgroud)
从 Symfony 3.4 开始,您可以避免使用工厂并使用扩展ServiceEntityRepository类的 TagRepository 服务,而不是直接使用 EntityRepository。
use AppBundle\Entity\GroupEntity;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;
class GroupEntityRepository extends ServiceEntityRepository
{
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, GroupEntity::class);
}
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您的服务将使用自动装配功能自动注册。
您还可以通过使用组合而不是继承在所有 Symfony 版本中做得更好。
final class GroupEntityRepository
{
/** @var EntityManagerInterface */
private $entityManager;
/** @var ObjectRepository */
private $objectRepository;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
$this->objectRepository = $this->entityManager->getRepository(GroupEntity::class);
}
Run Code Online (Sandbox Code Playgroud)
此服务也可以自动装配。您可以通过尊重SOLID 原则并创建一个接口来更进一步。这篇文章中有一个很好的解释(Symfony 中的存储库模式)