【发布时间】:2015-03-23 14:26:59
【问题描述】:
我像这样注册了我的 services.yml 文件:
services:
bb_shop.product_repository:
class: BB\ShopBundle\Entity\ProductRepository
factory_service: doctrine.orm.default_entity_manager
factory_method: getRepository
arguments: ['BBShopBundle:Product']
bb_shop.product_service:
class: BB\ShopBundle\Service\ProductService
arguments: [@bb_shop.product_repository]
这是我的存储库类:
class ProductRepository extends EntityRepository
{
public function saveProduct( $p)
{
$this->_em->persist($p);
$this->_em->flush();
}
}
这是我的服务类:
class ProductService {
protected $productRepository;
public function __construct(ProductRepository $R)
{
$this->productRepository =$R;
}
public function saveProduct( $p)
{
$this->productRepository->saveProduct($p);
}
}
这就是我在控制器中调用我的服务的方式:
$this->get('bb_shop.product_service')->saveProduct($product);
一切正常。 我的问题是: 1- 你能向我解释为什么我需要这 2 行,即使我在 EntityRepository 中有 EntityManager(由 $this->_em 使用)???
factory_service: doctrine.orm.default_entity_manager
factory_method: getRepository
2 - 这是进行依赖注入的好方法吗???
【问题讨论】:
-
既然可以在与实体相关的顶部注解中声明
* @ORM\Entity(repositoryClass="My\ProjectBundle\Entity\MyRepository"),为什么还要将Repositories注册为Services? -
我这样做是为了在服务类中注入存储库。我在实体类中声明了注释。
-
我是 SF2 的新手,所以请原谅这个问题,但是将您的存储库注册为服务有什么意义?
-
我对 SF2 也很陌生,但我认为关键是您可以通过将存储库声明为成员变量并在构造函数中对其进行初始化来使用服务类中的存储库。
-
但是当您可以在 RepositoryClass 中完成所有工作(获取数据)时,拥有一个服务类有什么意义呢?在您的代码中,
ProductService->saveProduct和ProductRepository->saveProduct之间没有太大区别。
标签: php symfony dependency-injection repository-pattern