在Symfony中, 我们使用命令执行的最常见的事情之一就是根据应用程序中的特定条件修改数据库内容的简单事实。通过控制器和服务中的实体管理器访问数据库非常简单且容易实现。在Commands中也很容易, 但是官方文档中没有对此进行记录和说明。就像Symfony 5中的所有内容一样, 你可以通过Services和Commands的构造函数注入服务, 因此要在命令内获取EntityManager, 只需注入EntityManagerInterface就像这样:
<?php
namespace 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.php
namespace 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 Interface
use 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 level
private $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;
}
}
编码愉快!
评论前必须登录!
注册