Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Symfony3.3将存储库注入服务时出错_Symfony_Dependency Injection_Doctrine Orm - Fatal编程技术网

使用Symfony3.3将存储库注入服务时出错

使用Symfony3.3将存储库注入服务时出错,symfony,dependency-injection,doctrine-orm,Symfony,Dependency Injection,Doctrine Orm,我有一个由服务层和存储库层组成的应用程序。对于服务和存储库,我已经声明了接口,并在控制器中为服务注入了接口,而为服务注入了存储库的接口。当autowire设置为true时,所有这些都将完成 当我在一个注入的服务上调用一个方法时,只要我不调用一个需要注入的存储库的函数,它就可以正常工作。当我尝试调用使用其中一个存储库的函数时,会出现以下错误: 无法自动连线服务“AppBundle\Repository\TestRepository”:方法“条令\ORM\EntityRepository::\uu构

我有一个由服务层和存储库层组成的应用程序。对于服务和存储库,我已经声明了接口,并在控制器中为服务注入了接口,而为服务注入了存储库的接口。当autowire设置为true时,所有这些都将完成

当我在一个注入的服务上调用一个方法时,只要我不调用一个需要注入的存储库的函数,它就可以正常工作。当我尝试调用使用其中一个存储库的函数时,会出现以下错误:

无法自动连线服务“AppBundle\Repository\TestRepository”:方法“条令\ORM\EntityRepository::\uu构造()”的参数“$em”必须具有类型提示或显式给定值

现在我想这与我的存储库从中扩展的EntityRepository类有关,因为当我查看构造函数时,它看起来像这样:

类TestRepository扩展EntityRepository实现TestRepositoryInterface { 公共函数构造( EntityManager$em, 映射\ClassMetadata$class ) { 父项::_构造($em,$class); } /** *@返回字符串 */ 公共函数getTest():字符串 { 返回“这是一个测试”; }
}无法直接实例化存储库。您需要使用EntityManager::getRepository

因此,您需要在services.yml中定义您的回购协议

// services.yml
AppBundle\Repository\UserRepository:
    factory: 'doctrine.orm.entity_manager:getRepository'
    arguments: ['AppBundle\Entity\User']
然后自动线注入就可以工作了


我很想知道autowire是否真的流行起来。这本身就是令人沮丧的,因为有些服务是通过魔法连接的,而另一些则需要手动干预,这可能会导致一点混乱。

实际上,有一种方法可以做到这一点,但我不确定我们是否可以/应该做到这一点

class TestRepository extends EntityRepository
{

    // Constructor for autowiring
    public function __construct(EntityManager $em)
    {
        parent::__construct($em, $em->getClassMetadata(Test::class));
    }

当我直接从控制器调用存储库时,这确实是一个解决方案。谢谢。