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

在Symfony应用程序/控制台中启用DBAL命令,symfony,configuration,doctrine-orm,dbal,Symfony,Configuration,Doctrine Orm,Dbal,当在开箱即用的命令行中使用“裸骨条令”时,有两个命令在Symfony和应用程序/控制台中似乎不可用: dbal dbal:import Import SQL file(s) directly to Database. dbal:run-sql Executes arbitrary SQL directly from the command line. 是否有一种方法可以在Symfony的应用程序/控制台中启用这些命令?我找到了一种解决方法,您可以这样称呼它,或者可能只是一种启

当在开箱即用的命令行中使用“裸骨条令”时,有两个命令在Symfony和
应用程序/控制台中似乎不可用:

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

是否有一种方法可以在Symfony的
应用程序/控制台中启用这些命令?

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

通过将
命令
添加到您自己的捆绑包中(或者由您自己决定是否添加专用捆绑包),您可以简单地将命令子类化。例如,要启用
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
后,我们将执行传递回父类。

将其作为
cli config.php
放到项目的根目录中。这将为
php供应商/bin/doctor
启用
--env
参数。它的“灵感”来自Symfony的应用程序/控制台文件


注意这是针对条令条令命令可通过DoctrineBundle(自版本)在symfony项目中使用


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

这些命令应该可以通过
bin/doctor
@kix;我明白。
bin/doctor
的问题在于它不理解
--env
参数。我希望这些命令可以从
app/console
获得。
<?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;