2014-04-23 130 views
4

當使用帶框的命令行使用裸骨主義時,有兩個可用的命令,對Symfony和app/console使用Doctrine似乎不可用:在Symfony應用程序/控制檯中啓用Doctrine DBAL命令

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

有沒有辦法在Symfony的app/console內啓用這些命令?

+0

這些命令應該可以通過'bin/doctrine'獲得。 – kix

+0

@kix;我明白那個。 'bin/doctrine'的問題是它不理解'--env'參數。我希望這些命令可以通過'app/console'獲得。 – Luke

回答

7

我找到了一個解決方法,就像你可以稱之爲,或者可能只是一種啓用命令的方法。

通過將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,我們將執行回傳給父類。

3

把這個作爲cli-config.php放到你項目的根目錄下。這將啓用php vendor/bin/doctrine--env參數。它受Symfony的應用/控制檯文件「啓發」。

請注意,這是用於Doctrine < = 2.3,更多版本請參閱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; 
1

學說命令是通過DoctrineBundle symfony的項目(因爲1.6.4版本)可用。您可以運行php bin/console doctrine:database:import [files]

相關問題