没有cli-config.php的Doctrine独立版

时间:2015-02-07 16:48:03

标签: php doctrine-orm symfony-components symfony-console

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

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

1。我绝对不希望项目根目录中有cli-config.php。 Sf Doctrine Bundle如何做到这一点?

2。另外(但不太重要),我想将Doctrine命令放入我的项目CLI中。 最好的方法是什么?在我的services.yml中创建对Doctrine命令的引用?或者创建通过PHP调用Doctrine命令的本地“装饰器命令”?

1 个答案:

答案 0 :(得分:2)

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

请阅读vendor/bin中的doctrine.php。避免使用硬编码的config-cli.php文件非常容易。

1。创建实体管理器

就我而言,我使用工厂,这种方法可以保护doctrine.em服务。

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

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

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中一样,你可能会声明你的Symfony\Component\Console\Application命令行界面,这就是我这样做的方式(foreach只是添加了我services.yml中定义的命令1}}文件):

$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();

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

$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's answer on this GitHub issue添加Doctrine命令的子集。

3。奖励:仅导入所需命令并重命名

您可以创建继承Doctrine命令的装饰器命令(这对于重新定义Doctrine命令的名称非常有用,正如Symfony Doctrine Bundle所做的那样,例如。orm:validate-schema - > doctrine:schema:validate)。

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

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

<?php

namespace MyApp\Command\Doctrine;

use Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand;

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 Doctrine Bundle:p(jk)