如何在此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
答案 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 以获得更详细的说明。
致你的代码:
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.
]);
}
}
# app/config/services.yml
services:
_defaults:
autowire: true
Project\ManagmentBundle\:
resource: ../../src/ManagmentBundle
<?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;
}