【如何在Symfony 5的命令中访问实体管理器(Doctrine)】在Symfony中, 我们使用命令执行的最常见的事情之一就是根据应用程序中的特定条件修改数据库内容的简单事实。通过控制器和服务中的实体管理器访问数据库非常简单且容易实现。在Commands中也很容易, 但是官方文档中没有对此进行记录和说明。就像Symfony 5中的所有内容一样, 你可以通过Services和Commands的构造函数注入服务, 因此要在命令内获取EntityManager, 只需注入EntityManagerInterface就像这样:
<
?phpnamespace App\Command;
// ...use Doctrine\ORM\EntityManagerInterface;
class ExampleCommand extends Command{// ...private $entityManager;
public function __construct(EntityManagerInterface $entityManager){$this->
entityManager = $entityManager;
parent::__construct();
}// ...}
整个类都可以访问实体管理器, 你将能够像在控制器和服务中通常那样运行查询, 创建和持久化实体。
例子下面的ExampleCommand.php文件包含上述逻辑。你可以简单地更新命令的代码并更改名称:
<
?php// src/Command/ExampleCommand.phpnamespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
// 1. Import the ORM EntityManager Interfaceuse Doctrine\ORM\EntityManagerInterface;
class ExampleCommand extends Command{// the name of the command (the part after "bin/console")protected static $defaultName = 'app:run-example';
// 2. Expose the EntityManager in the class levelprivate $entityManager;
public function __construct(EntityManagerInterface $entityManager){// 3. Update the value of the private entityManager variable through injection$this->
entityManager = $entityManager;
parent::__construct();
}protected function configure(){// ...}// 4. Use the entity manager in the command code ...protected function execute(InputInterface $input, OutputInterface $output){$em = $this->
entityManager;
// A. Access repositories$repo = $em->
getRepository("App:SomeEntity");
// B. Search using regular methods.$res1 = $repo->
find(1);
$res2 = $repo->
findBy(['field' =>
'value']);
$res3 = $repo->
findAll();
$res4 = $repo->
createQueryBuilder('alias')->
where("alias.field = :fieldValue")->
setParameter("fieldValue", 123)->
setMaxResults(10)->
getQuery()->
getResult();
// C. Persist and flush$em->
persist($someEntity);
$em->
flush();
return 0;
}}
编码愉快!
推荐阅读
- 如何将Exchange 2013、2016、2019公用文件夹迁移到Office 365()
- 如何正确为Node.js创建全局模块
- 如何在Node.js中使用svgo减少(缩小)SVG文件大小
- 5种最具破坏力的外包刻板印象被揭穿
- EmailChecker评论(最好的电子邮件验证工具之一)
- 如何执行Python脚本并检索Node.js中的输出(数据和错误)
- 每日三道面试题,通往自由的道路14——MySQL
- Ubuntu系统用ceph-deploy部署ceph
- RocketMQ基础概念剖析,并分析一下Producer的底层源码