将服务调用到EntityRepository中

时间:2016-02-18 13:40:55

标签: symfony

如何在此EntityRepository中调用服务

class CityRepository extends EntityRepository{

   public function guessCity($name){
    // ..... call service
   }
}

这是我的服务

namespace Project\ManagmentBundle\Services;

class FormatString {

public function replaceAccents($str)
{ 
  .....
}

services.yml

services:
project.format_string:
  class: Project\ManagmentBundle\Services\FormatString      

2 个答案:

答案 0 :(得分:1)

你不应该这样做。相反,您应该从您的服务调用存储库。

IMO将任何容器服务传递到存储库都是不好的做法。

但是,如果您确实需要这样做,那么您可以将您的存储库注册为服务,然后向其注入其他服务。这个案例的答案很好:https://stackoverflow.com/a/17230333/919567

答案 1 :(得分:1)

自2017年起和Symfony 3.3 + ,您可以使用服务模式轻松完成此操作。

将服务传递给存储库并不是一种糟糕的做法,如果您尝试这样做,它会非常复杂以至于会造成非常混乱的代码。

查看我的帖子How to use Repository with Doctrine as Service in Symfony 以获得更详细的说明。

致你的代码:

1。从存储库中删除对Doctrine的直接依赖

namespace Project\ManagmentBundle\Repository;

use Doctrine\ORM\EntityManagerInterface;

class CityRepository
{
    private $repository;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->repository = $entityManager->getRepository(City::class);
    }

    public function guessCity($name)
    {
        return $this->repository->findBy([ 
            'name' => $name // improve logic with LIKE %...% etc.
        ]);
    }
}

2。使用自动装配注册服务

# app/config/services.yml
services:
    _defaults:
        autowire: true

    Project\ManagmentBundle\:
       resource: ../../src/ManagmentBundle

3。现在可以轻松地将任何服务添加到存储库

<?php

use Project\ManagmentBundle\Services\FormatString;

class CityRepository
{
    private $repository;

    private $formatString;

    public function __construct(EntityManagerInterface $entityManager, FormatString $formatString)
    {
        $this->repository = $entityManager->getRepository(City::class);
        $this->formatString = $formatString;
    }