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

Posted

技术标签:

【中文标题】如何在 Symfony 单命令应用程序中访问 EntityManager?【英文标题】:How to access the EntityManager in a Symfony Single Command Application? 【发布时间】:2022-01-07 10:59:40 【问题描述】:

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

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

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

【问题讨论】:

查看 Doctrine 2 文档,了解如何在 Symfony 之外配置您自己的实体管理器。否则,只需使用 Symfony 框架框架并安装 Doctrine 包。 看起来我已经安装了学说包...这很有意义,因为我一直在 sf 应用程序中使用 Doctrine CLI...我会检查一下骨架。跨度> 您对 DoctrineBundle 的评论实际上很令人困惑。当 Symfony 控制台组件作为独立包安装时,使用 SingleCommandApp 类。你肯定不会有任何捆绑软件,因为它们需要完整的 Symfony 框架。您可能会对将命令添加到框架和单独使用控制台组件之间的区别感到困惑。大不同。 @Cerad 你对我的困惑可能是对的。我的想法是组合一个只有一个命令的应用程序。我考虑过使用标准命令创建并将其设为默认值,但我想尝试 SingleCommandApp。至于框架,我的 composer.json 文件中有几个包,我正在使用 maker 包来创建实体 【参考方案1】:

如果您真正使用的是单命令应用程序,则必须在 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() 方法时,你可能会得到类似 this 的东西,但你仍然需要“手动”实例化 Doctrine 连接,甚至如果您正在执行要注入的不同服务)。

【讨论】:

嗨@yivi 感谢您的回答。我使用了类似于你建议的东西,但现在我在使用 ORM 映射时遇到了问题。如果我使用 $useSimpleAnnotationReader = true 实体类不会被识别,如果我使用 false 表名的大小写与类名不匹配,因此它也不起作用:( 哦,我很抱歉。不过,这有点超出了这个问题的范围,不是吗?这更像是在 Symfony 之外为现有 DB+实体配置 Doctrine ORM 的问题,对吧?

以上是关于如何在 Symfony 单命令应用程序中访问 EntityManager?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置对 symfony 的访问

Symfony2 - 如何在自定义控制台命令中访问服务?

如何使用 messages.en.yml 翻译 symfony2 形式的标签?

如何在 Symfony 布局中获取 _locale 变量?

Symfony |如何从控制器中的存储库访问自定义方法?

如何在事件订阅者中访问 Symfony 3.3 中的登录用户而不会丢失 Web Profiler