dva*_*mil 3 dependency-injection symfony doctrine-orm
我有一个由服务层和存储库层组成的应用程序.对于服务和存储库,我已经声明了接口,我为控制器中的服务注入了接口,并且服务注入了存储库的接口.这一切都是在autowire设置为true的情况下完成的.
当我在其中一个注入的服务上调用一个方法时,它一切正常,只要我不调用需要其中一个注入的存储库的函数.当我尝试调用使用其中一个存储库的函数时,我收到以下错误:
无法自动装配服务"AppBundle\Repository\TestRepository":方法"Doctrine\ORM\EntityRepository :: __ construct()"的参数"$ em"必须具有类型提示或显式赋予值.
现在我认为这与我必须从我的存储库扩展的EntityRepository类这一事实有关,因为当我查看构造函数时,它看起来像这样:
class TestRepository extends EntityRepository implements TestRepositoryInterface
{
public function __construct(
EntityManager $em,
Mapping\ClassMetadata $class
) {
parent::__construct($em, $class);
}
/**
* @return string
*/
public function getTest(): string
{
return 'This is a test';
}
}Run Code Online (Sandbox Code Playgroud)
其中显然包含错误消息中提到的$ em参数.我不知道如何解决这个问题.目前我的服务和存储库在services.yml中配置相同,但由于服务似乎有效,我认为这不是问题.我是否需要为我的存储库禁用autowire并在services.yml中手动配置它们,或者我只是遗漏了一些非常明显的东西?
存储库无法直接实例化.您需要使用EntityManager :: getRepository
因此,您需要在services.yml中定义您的repos
// services.yml
AppBundle\Repository\UserRepository:
factory: 'doctrine.orm.entity_manager:getRepository'
arguments: ['AppBundle\Entity\User']
Run Code Online (Sandbox Code Playgroud)
然后autowire注入应该工作.
我很想知道autowire是否真的流行起来.它本质上是令人沮丧的,因为有些服务就像魔术一样连接,而其他服务需要人工干预,这可能会导致一些混乱.
| 归档时间: |
|
| 查看次数: |
2096 次 |
| 最近记录: |