hou*_*ded 2 php dependency-injection symfony
您好,关于依赖注入的快速问题
我正在使用symfony 3并且正在接受 DI
说我有课
use Doctrine\ORM\EntityManagerInterface;
class CommonRepository
{
/**
* @var EntityManagerInterface
*/
protected $em;
/**
* DoctrineUserRepository constructor.
* @param EntityManagerInterface $em
*/
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function getEntityManager()
{
return $this->em;
}
}
Run Code Online (Sandbox Code Playgroud)
现在有一个名为 UserRepository 的新类,我注入了上面的类,这是否意味着我可以访问注入的项目(显然他在开始时就在做梦)?
class UserRepository
{
/**
* @var CommonDoctrineRepository
*/
private $commonRepository;
/**
* @var \Doctrine\ORM\EntityManagerInterface
*/
private $em;
/**
* DoctrineUserRepository constructor.
* @param CommonRepository $CommonRepository
*/
public function __construct(CommonRepository $CommonRepository)
{
$this->commonRepository = $commonRepository;
$this->em = $this->commonRepository->getEntityManager();
}
public function find($id)
{
//does not seem to work
//return $em->find($id);
//nor does
//return $this->em->find($id);
}
}
Run Code Online (Sandbox Code Playgroud)
即使我扩展类,然后尝试构造父类,也没有什么乐趣,显然我可以将 Doctrine 管理器注入到 UserRepository 中,我只是想对 DI 和继承有一些了解
class UserRepository extends CommonRepository
{
/**
* @var CommonDoctrineRepository
*/
private $commonRepository;
/**
* @var \Doctrine\ORM\EntityManagerInterface
*/
private $em;
public function __construct(CommonDoctrineRepository $commonRepository, $em)
{
parent::__construct($em);
$this->commonRepository = $commonRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
对于 symfony 组件,我定义了类似的服务
app.repository.common_repository:
class: AppBundle\Repository\Doctrine\CommonRepository
arguments:
- "@doctrine.orm.entity_manager"
app.repository.user_repository:
class: AppBundle\Repository\Doctrine\UserRepository
arguments:
- "@app.repository.common_repository"
Run Code Online (Sandbox Code Playgroud)
依赖注入只是将对象传递给构造函数(或setter方法)的过程。依赖注入容器(或服务容器)只不过是一个将正确的对象实例注入构造函数的帮助器。
话虽如此,很明显依赖注入不会以任何方式影响 PHP(顺便说一句,Symfony 中没有任何影响,这只是简单的 PHP 东西)。
因此继承的工作方式就像处理一些普通的 PHP 对象一样(这是一个奇怪的比较,因为它们已经是普通的 PHP 对象)。
这意味着如果CommonRepository#getEntityManager()是 public 并且CommonRepository正确实例化,则此方法应该返回传递给其构造函数的实体管理器。
这同样适用于UserRepository:如果将传递的CommonRepository#getEntityManager()实例保存在$em属性中,则所有方法都可以使用此属性访问实体管理器$em。这意味着这样做$this->em->find(...)应该完美地工作($em->find(...)不应该,因为没有$em变量)。
tl;dr:您在问题中显示的代码(除了奇怪的扩展示例)工作得很好。