有没有办法将EntityManager注入服务

时间:2017-06-28 18:10:52

标签: symfony symfony-3.3

在使用Symfony 3.3时,我宣布这样的服务:

class TheService implements ContainerAwareInterface
{
    use ContainerAwareTrait;
    ...
}

在我需要EntityManager的每个动作中,我从容器中获取它:

$em = $this->container->get('doctrine.orm.entity_manager');

这有点烦人,所以我很好奇Symfony是否有类似EntityManagerAwareInterface的内容。

3 个答案:

答案 0 :(得分:16)

传统上,您将在services.yml文件中创建一个新的服务定义,将实体管理器设置为构造函数的参数

app.the_service:
    class: AppBundle\Services\TheService
    arguments: ['@doctrine.orm.entity_manager']

最近,随着symfony 3.3的发布,默认的symfony-standard-edition将默认的services.yml文件更改为默认使用autowire并将AppBundle中的所有类添加到是服务。这消除了添加自定义服务的需要,并且在构造函数中使用类型提示将自动注入正确的服务。

您的服务类将如下所示

use Doctrine\ORM\EntityManagerInterface

class TheService
{
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    // ...
}

有关自动定义服务依赖关系的更多信息,请参阅https://symfony.com/doc/current/service_container/autowiring.html

此处提供了新的默认services.yml配置文件:https://github.com/symfony/symfony-standard/blob/3.3/app/config/services.yml

答案 1 :(得分:1)

有时我会将EM注入到服务器上的服务中,如service.yml:

中所示
 application.the.service:
      class: path\to\te\Service
      arguments:
        entityManager: '@doctrine.orm.entity_manager'

然后在服务类上获取__construct方法。 希望它有所帮助。

答案 2 :(得分:0)

我遇到了同样的问题,并通过编辑迁移代码解决了它。

我换了

$this->addSql('ALTER TABLE user ADD COLUMN name VARCHAR(255) NOT NULL');

$this->addSql('ALTER TABLE user ADD COLUMN name VARCHAR(255) NOT NULL DEFAULT "-"');

我不知道为什么 bin/console make:entity 在这些情况下不提示我们提供默认值。 Django 做到了,而且效果很好。