在 Symfony 应用程序/控制台中启用 Doctrine DBAL 命令

Posted

技术标签:

【中文标题】在 Symfony 应用程序/控制台中启用 Doctrine DBAL 命令【英文标题】:Enabling Doctrine DBAL commands in Symfony app/console 【发布时间】:2014-06-07 16:27:36 【问题描述】:

当通过开箱即用的命令行使用准系统 Doctrine 时,有两个可用的命令似乎不适用于将 Doctrine 与 Symfony 和 app/console 一起使用:

dbal
  dbal:import    Import SQL file(s) directly to Database.
  dbal:run-sql   Executes arbitrary SQL directly from the command line.

有没有办法在 Symfony 的 app/console 中启用这些命令?

【问题讨论】:

这些命令应该可以通过bin/doctrine获得。 @kix;我明白那个。 bin/doctrine 的问题在于它不理解 --env 参数。我希望这些命令可以从app/console 获得。 【参考方案1】:

我找到了一种解决方法,您可以这样称呼它,或者只是一种启用命令的方法。

通过将Command 添加到您自己的捆绑包之一(或专用捆绑包,取决于您),您可以简单地继承 Doctrine 命令。例如。要启用dbal:import 命令,请使用以下命令:

namespace Acme\Bundle\AcmeBundle\Command\Doctrine;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

use Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper;
use Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper;

class ImportCommand extends \Doctrine\DBAL\Tools\Console\Command\ImportCommand 

    protected function execute(InputInterface $input, OutputInterface $output)
    
        $container = $this->getApplication()->getKernel()->getContainer();

        $doctrine = $container->get('doctrine');

        $em = $doctrine->getEntityManager();
        $db = $em->getConnection();

        $helperSet = $this->getHelperSet();
        $helperSet->set( new ConnectionHelper( $db ), 'db' );
        $helperSet->set( new EntityManagerHelper( $em ), 'em' );

        parent::execute( $input, $output );
    


如您所见,我们只是将原始命令子类化。由于数据库配置由 Symfony 管理,我们需要通过容器获取实体管理器。一旦我们更新了HelperSet,我们就会将执行传递回父类。

【讨论】:

【参考方案2】:

将此作为cli-config.php 放入项目的根目录中。这将为php vendor/bin/doctrine 启用--env 参数。它受到 Symfony 的应用程序/控制台文件的“启发”。

注意这是针对 Doctrine the docs 了解较新的版本。

<?php
require_once __DIR__.'/app/bootstrap.php.cache';
require_once __DIR__.'/app/AppKernel.php';

use Symfony\Component\Console\Input\ArgvInput;

$input = new ArgvInput();
$env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');
$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(array('--no-debug', '')) && $env !== 'prod';

$kernel = new AppKernel($env, $debug);
$kernel->boot();

$em = $kernel->getContainer()->get('doctrine.orm.entity_manager');

$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
    'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
    'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));

return $helperSet;

【讨论】:

【参考方案3】:

通过 DoctrineBundle(自版本 1.6.4 起)可以在 symfony 项目中使用 Doctrine 命令。

您现在可以运行php bin/console doctrine:database:import [files]

【讨论】:

以上是关于在 Symfony 应用程序/控制台中启用 Doctrine DBAL 命令的主要内容,如果未能解决你的问题,请参考以下文章

我在 OpenEMR 中的第一个 Symfony 2.4 组件控制器

启用“记住我”时,在 Symfony 2 应用程序中注销用户

启用异常控制器时自定义错误页面不起作用

Symfony2 - 如何验证控制器中的电子邮件地址

Symfony、nelmio/api-doc-bundle 和 @SWG\SecurityScheme

Symfony 部署后清除缓存组件