如何在 Symfony 单一命令应用程序中访问 EntityManager?

How to access the EntityManager in a Symfony Single Command Application?

我正在开发 Symfony Single Command Application。我正在使用 Doctrine 来管理实体。

我使用 Symfony CLI 创建了实体配置,现在我不确定如何从 run 方法中访问 EM。

我应该为此创建一个 SingleCommandApplication 的新子类吗?

如果你真的使用单一命令应用程序,你必须在 setCode() 方法中自行配置 Doctrine。例如。关注 these instructions.

(new SingleCommandApplication())
    ->setName('My Super Command') // Optional
    ->setVersion('1.0.0') // Optional
    ->addArgument('foo', InputArgument::OPTIONAL, 'The directory')
    ->addOption('bar', null, InputOption::VALUE_REQUIRED)
    ->setCode(function (InputInterface $input, OutputInterface $output) {

        $paths = array("/path/to/entity-files");
        $isDevMode = false;

        // the connection configuration
        $dbParams = [
            'driver'   => 'pdo_mysql',
            'user'     => 'db_user',
            'password' => 'very_secret',
            'dbname'   => 'foo',
        ];

        $config = Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
        $em     = Doctrine\ORM\EntityManager::create($dbParams, $config);

        // output arguments and options
    })
    ->run();

在单个命令应用程序中,您没有这样的“捆绑包”,因为您在框架捆绑包之外运行,而且通常您也无法访问依赖项注入。

(如果你想要 DI,在实例化的 Application 对象上调用 setDefaultCommand() 方法时,你可能会有类似 的东西,但你仍然需要实例化Doctrine 连接“手动”,即使你在不同的服务上做注入)。