没有cli-config.php的独立学说



我想将Doctrine ORM集成到我的(非Symfony)项目中。我已经在另一个项目中做到了这一点,并使用了著名的cli-config.php到项目根目录中。

但现在,在我的新项目中,我使用Symfony控制台组件和依赖注入组件(通过标记服务和命令来引用它们)。

1.我绝对不想在项目根目录中有cli-config.php。Sf条令捆绑包是如何做到这一点的?

2。此外(但不太重要),我希望在我的项目CLI中包含Doctrine命令。最好的方法是什么?在我的services.yml中创建对条令命令的引用?或者创建本地"装饰器命令",通过PHP调用Doctrine命令?

最后,经过一些谷歌搜索和实验,我找到了一个完整的解决方案。

只需阅读vendor/bin中的doctrine.php即可。很容易避免使用硬编码的config-cli.php文件。

1.创建实体经理

在我的例子中,我使用了一个工厂,这种方法使doctrine.em服务水合。

$config特定于我的应用程序,更改值以使用您自己的逻辑。)

use DoctrineORMToolsSetup;
use DoctrineORMEntityManager;
public function createEntityManager()
{
    $config = $this->get('config');
    $metadataConfig = Setup::createAnnotationMetadataConfiguration(
        [$config->meta('app_path') . '/Entity'],
        $config->oc->doctrine->dev_mode
    );
    return EntityManager::create((array) $config->oc->doctrine->connection, $metadataConfig);
}

2.在CLI命令中合并Doctrine CLI命令

在你的代码中,比如在一些bootstrap.php中,你可能会声明你的SymfonyComponentConsoleApplication命令行接口,这就是我的做法(foreach只是添加了在我的services.yml文件中定义的命令):

$application = new Application('MyApp CLI', '0.0.1');
$services = $container->findTaggedServiceIds('oc.command');
foreach(array_keys($services) as $serviceId)
{
    $application->add($container->get($serviceId));
}
$application->run();

现在,我们只是要求条令将其命令注入我们的应用程序:

$application = new Application('MyApp CLI', '0.0.1');
$helperSet = ConsoleRunner::createHelperSet($container->get('doctrine.em'));
$application->setHelperSet($helperSet);
ConsoleRunner::addCommands($application);
$services = $container->findTaggedServiceIds('oc.command');
foreach(array_keys($services) as $serviceId)
{
    $application->add($container->get($serviceId));
}
$application->run();

就是这样!你也只能通过使用arsfeld对这个GitHub问题的回答来添加Doctrine命令的子集。

3.奖励:只导入所需的命令并重命名它们

您可以创建继承条令命令的装饰器命令(这对于重新定义条令命令的名称很有用,就像Symfony条令捆绑包所做的那样,例如orm:validate-schema->doctrine:schema:validate)。

为此,请删除我们在步骤2中添加的行ConsoleRunner::addCommands($application);。对于每个要重新定义的命令,您都需要在应用程序中创建一个注册新命令。该命令将"extends"目标条令命令,并将覆盖configure()方法。

以下是orm:validate-schema:的示例

<?php
namespace MyAppCommandDoctrine;
use DoctrineORMToolsConsoleCommandValidateSchemaCommand;
class SchemaValidateCommand extends ValidateSchemaCommand
{
    protected function configure()
    {
        parent::configure();
        $this->setName('doctrine:schema:validate');
    }
}

有些Doctrine命令的别名会污染您的命令名称空间,如orm:generate-entitiesorm:generate:entities。要删除这些别名,请在configure()中添加->setAliases(array())

$this->setName('doctrine:generate:entities')->setAliases([]);

祝贺你,你刚刚重做了Symfony条令捆绑包:p(jk)

相关内容

  • 没有找到相关文章

最新更新