2015-08-15 29 views
2

我正在嘗試將模式更新到多個數據庫中,具體取決於所使用的配置環境,這些更改將在數據庫或其他數據庫中完成。教條cli中的多個環境

我想一個自己--env參數添加到腳本學說:

vendor/bin/doctrine --env=dev orm:schema-tool:update --force -vvv --dump-sql 

我的CLI-config.php文件裏面我讀的參數,並選擇我的數據庫,但在那之後,它失敗:

[RuntimeException]     
The "--env" option does not exist. 

Exception trace: 
() at /var/www/consupermiso2-frontend/vendor/symfony/console/Input/ArgvInput.php:213 
Symfony\Component\Console\Input\ArgvInput->addLongOption() at /var/www/consupermiso2-frontend/vendor/symfony/console/Input/ArgvInput.php:152 
Symfony\Component\Console\Input\ArgvInput->parseLongOption() at /var/www/consupermiso2-frontend/vendor/symfony/console/Input/ArgvInput.php:86 
Symfony\Component\Console\Input\ArgvInput->parse() at /var/www/consupermiso2-frontend/vendor/symfony/console/Input/Input.php:61 
Symfony\Component\Console\Input\Input->bind() at /var/www/consupermiso2-frontend/vendor/symfony/console/Command/Command.php:231 
Symfony\Component\Console\Command\Command->run() at /var/www/consupermiso2-frontend/vendor/symfony/console/Application.php:878 
Symfony\Component\Console\Application->doRunCommand() at /var/www/consupermiso2-frontend/vendor/symfony/console/Application.php:195 
Symfony\Component\Console\Application->doRun() at /var/www/consupermiso2-frontend/vendor/symfony/console/Application.php:126 
Symfony\Component\Console\Application->run() at /var/www/consupermiso2-frontend/vendor/doctrine/orm/lib/Doctrine/ORM/Tools/Console/ConsoleRunner.php:60 
Doctrine\ORM\Tools\Console\ConsoleRunner::run() at /var/www/consupermiso2-frontend/vendor/doctrine/orm/bin/doctrine.php:66 
include() at /var/www/consupermiso2-frontend/vendor/doctrine/orm/bin/doctrine:4 


orm:schema-tool:update [--complete] [--dump-sql] [-f|--force] 

如何選擇使用cli工具在哪個數據庫中工作?

回答

1

因此,讓我們假設你有一個擁有自己的數據庫的應用程序,再加上它使用一個單獨的數據庫來存儲它的所有幫助系統數據。這個幫助數據庫可以在同一臺服務器上的應用程序的不同安裝中共享。

在Symfony中,很容易指定不同的實體管理器,因此您可以選擇和選擇要使用的實體管理器。這可以通過命令行或控制器輕鬆完成。

config.yml文件,你有這樣的事情(這些參數會坐在parameters.yml):

doctrine: 
    dbal: 
     default_connection: default 
     connections: 
      default: 
       driver: "%database_driver%" 
       host:  "%database_host%" 
       port:  "%database_port%" 
       dbname: "%database_name%" 
       user:  "%database_user%" 
       password: "%database_password%" 
       charset: UTF8 
      help: 
       driver: "%database_driver2%" 
       host:  "%database_host2%" 
       port:  "%database_port2%" 
       dbname: "%database_name2%" 
       user:  "%database_user2%" 
       password: "%database_password2%" 
       charset: UTF8 

orm: 
    default_entity_manager: default 
    entity_managers: 
     default: 
      connection: default 
      mappings: 
       MainBundle: ~ 
     help: 
      connection: customer 
      mappings: 
       HelpBundle: ~d 

您都可以指定從這樣的命令行使用的數據庫:

php app/console doctrine:schema:update --force --em=help 

或控制器是這樣的:

$entityManager = $this->get('doctrine')->getManager('help'); 

,如果你需要更多的信息,看看一個的symfony docs

+0

我沒有使用Symfony,我的應用程序在Phalcon框架下。我有兩個數據庫,每個環境一個(讓我們想象不同國家的不同網站)。所以我需要指定原則哪些數據庫連接需要更新。 更具體地說,我的cli-config.php讀取一個配置文件(country1.yml,country2.yml)並使用指定的連接參數來初始化原則連接。 – mcarra66

+0

雖然使用了symfony控制檯,但在錯誤消息中已明確指出。如果你只是使用這個模塊,會有一些配置它的方法,所以我的答案中的基本原則仍然適用。您需要爲每個EM指定一個不同的EM。 – DevDonkey

+2

Nop。這與Symfony無關,只是doctrine.php,它啓動了cli-config.php。 vendor/bin/doctrine --em = dev orm:schema-tool:update --force -vvv --dump -sql [RuntimeException] 「--em」選項不存在。 – mcarra66

0

OKS,我已經解決了我的自我如下:

在你的config/CLI-config.php文件中添加如下代碼加載之前你配置文件:

$environmentName = null; 

foreach ($_SERVER['argv'] as $index => $arg) { 
    $e = explode('=', $arg); 
    $key = str_replace('-', '', $e[0]); 

    if ('em' == $key) { 
     $environmentName = $e[1]; 
     unset($_SERVER['argv'][$index]); 
    } 
} 

if (empty($environmentName)) { 
    throw new EmptyEnvironmentException('Try adding --em=[environment] option'); 
} 

$environmentFilePath = PROJECT_PATH . "/config/$environmentName.yml"; 

if (!is_readable($environmentFilePath)) { 
    throw new UnexpectedConfigFileException($environmentName); 
} 

$config = new PhConfig($environmentFilePath); 

所以,你必須閱讀給定的屬性,並從$ _ SERVER [「argv」]作爲將其刪除,或學說將嘗試解析它拋出異常。