在使用Symfony 3.3
时,我宣布这样的服务:
class TheService implements ContainerAwareInterface
{
use ContainerAwareTrait;
...
}
在我需要EntityManager的每个动作中,我从容器中获取它:
$em = $this->container->get('doctrine.orm.entity_manager');
这有点烦人,所以我很好奇Symfony是否有类似EntityManagerAwareInterface
的内容。
答案 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 做到了,而且效果很好。