symfony 4 使用依赖注入获取学说 documentManger
symfony 4 get doctrine documentManger with dependency injection
我必须在项目中使用 Symfony 4 和 MongoDB。我可以像这样访问控制器中的 DocumentManager:
$dm = $this->get('doctrine_mongodb')->getManager();
在运行时,但不像其他服务(例如 Doctrine EntityManager)通过任何方法或构造函数的参数。所以我不知道如何在服务中达到它。
如果我不在services.yaml里注册,Symfony 是找不到的,很清楚。但是如果我尝试注册:
Doctrine\:
resource: '../vendor/doctrine/mongodb-odm/lib/Doctrine/*'
它 returns 也是一个错误:
(1/1) 致命错误异常
编译错误:无法将 'Bool' 用作 class 名称,因为它已保留
在 Bool.php(第 26 行)
它似乎与 php 7 不兼容,但是 Symfony 4 需要什么。
有谁知道如何解决这个矛盾?
提前致谢!
我找到了一个解决方案,可能对其他人有用:
dev-master / 3.5.x-dev 版本 doctrine/mongodb-odm-bundle 不会出现此问题。
https://packagist.org/packages/doctrine/mongodb-odm-bundle#dev-master
最初 composer.json 需要“^3.0”,所以作曲家下载了 3.4.1,这是最新的稳定版本。将版本修改为“3.5.x-dev”至少解决了开发问题。
您可以注入 ManagerRegistry 并从中获取管理器
<?php
use Doctrine\Bundle\MongoDBBundle\ManagerRegistry;
class SomeController
{
public function someAction(ManagerRegistry $managerRegistry)
{
$user = new Object();
$user->setName("John");
$dm = $managerRegistry->getManager();
$dm->persist($user);
$dm->flush();
//do something
}
}
我必须在项目中使用 Symfony 4 和 MongoDB。我可以像这样访问控制器中的 DocumentManager:
$dm = $this->get('doctrine_mongodb')->getManager();
在运行时,但不像其他服务(例如 Doctrine EntityManager)通过任何方法或构造函数的参数。所以我不知道如何在服务中达到它。 如果我不在services.yaml里注册,Symfony 是找不到的,很清楚。但是如果我尝试注册:
Doctrine\:
resource: '../vendor/doctrine/mongodb-odm/lib/Doctrine/*'
它 returns 也是一个错误: (1/1) 致命错误异常 编译错误:无法将 'Bool' 用作 class 名称,因为它已保留 在 Bool.php(第 26 行)
它似乎与 php 7 不兼容,但是 Symfony 4 需要什么。
有谁知道如何解决这个矛盾?
提前致谢!
我找到了一个解决方案,可能对其他人有用: dev-master / 3.5.x-dev 版本 doctrine/mongodb-odm-bundle 不会出现此问题。 https://packagist.org/packages/doctrine/mongodb-odm-bundle#dev-master 最初 composer.json 需要“^3.0”,所以作曲家下载了 3.4.1,这是最新的稳定版本。将版本修改为“3.5.x-dev”至少解决了开发问题。
您可以注入 ManagerRegistry 并从中获取管理器
<?php
use Doctrine\Bundle\MongoDBBundle\ManagerRegistry;
class SomeController
{
public function someAction(ManagerRegistry $managerRegistry)
{
$user = new Object();
$user->setName("John");
$dm = $managerRegistry->getManager();
$dm->persist($user);
$dm->flush();
//do something
}
}