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

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

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

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

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

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

最佳答案

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

只需阅读 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 文件中定义的命令:

$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 将它的命令注入(inject)到我们的应用程序中:

$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); 行。对于要重新定义的每个命令,您需要创建一个注册新命令在你的应用程序中。此命令将“扩展”目标 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)

关于php - 没有 cli-config.php 的学说独立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28384739/

相关文章:

php - JanRain PHP OpenID : How to check if a provider supports AX programmatically?

php - 从数据库中选择偏移量

symfony - 预期参数类型为 "string",给出 "App\Entity"

php - Doctrine2.3 和 OneToOne 级联持久化似乎不起作用

交响乐。提交表单后,其 CollectionType 字段的 ArrayCollection 中不包含单个元素

php - Laravel 4 队列 :listen times out

php - 我怎样才能把这个 jQuery 点击函数变成 keyup 函数?

javascript - 使用javascript获取在php中设置的cookie的值

php - 使用 OptionsResolver 组件进行高级类型验证

php - Symfony2 - 查找器组件