Stiamo creando un comando che si basa su altri comandi per generare un nuovo database e creare il suo schema. Finora l'abbiamo ottenuto con successo per leggere il file config.yml, aggiungere le nostre nuove informazioni di connessione e per scrivere di nuovo il file. Nello stesso comando cerchiamo quindi di eseguire i comandi di symfony per creare il database e lo schema: aggiornamento. Questo è dove stiamo incontrando problemi. Otteniamo il seguente errore:Symfony 2: accesso alla configurazione aggiornata da un comando
[InvalidArgumentException] Doctrine ORM Manager named "mynewdatabase" does not exist.
Se lanciamo il comando una seconda volta non v'è alcun errore perché il file di configurazione aggiornato viene caricato fresca nell'applicazione. Se eseguiamo manualmente i comandi doctrine dopo aver scritto nel file config.yml, funziona anche senza errori.
Stiamo pensando che al punto nel nostro comando in cui stiamo eseguendo il database di creare e aggiornare i comandi, sta ancora utilizzando la versione corrente del kernel di config.yml/database.yml che sono memorizzati in memoria. Abbiamo provato diversi modi per reinizializzare la configurazione dell'applicazione/del kernel (chiamando shutdown(), boot(), ecc.) Senza fortuna. Ecco il codice:
namespace Test\MyBundle\Command;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Yaml\Yaml;
class GeneratorCommand extends ContainerAwareCommand
{
protected function configure()
{
$this
->setName('generate')
->setDescription('Create a new database.')
->addArgument('dbname', InputArgument::REQUIRED, 'The db name')
;
}
/*
example: php app/console generate mynewdatabase
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
//Without this, the doctrine commands will prematurely end execution
$this->getApplication()->setAutoExit(false);
//Open up app/config/config.yml
$yaml = Yaml::parse(file_get_contents($this->getContainer()->get('kernel')->getRootDir() .'/config/config.yml'));
//Take input dbname and use it to name the database
$db_name = $input->getArgument('dbname');
//Add that connection to app/config/config.yml
$yaml['doctrine']['dbal']['connections'][$site_name] = Array('driver' => '%database_driver%', 'host' => '%database_host%', 'port' => '%database_port%', 'dbname' => $site_name, 'user' => '%database_user%', 'password' => '%database_password%', 'charset' => 'UTF8');
$yaml['doctrine']['orm']['entity_managers'][$site_name] = Array('connection' => $site_name, 'mappings' => Array('MyCustomerBundle' => null));
//Now put it back
$new_yaml = Yaml::dump($yaml, 5);
file_put_contents($this->getContainer()->get('kernel')->getRootDir() .'/config/config.yml', $new_yaml);
/* http://symfony.com/doc/current/components/console/introduction.html#calling-an-existing-command */
//Set up our db create script arguments
$args = array(
'command' => 'doctrine:database:create',
'--connection' => $site_name,
);
$db_create_input = new ArrayInput($args);
//Run the symfony database create arguments
$this->getApplication()->run($db_create_input, $output);
//Set up our schema update script arguments
$args = array(
'command' => 'doctrine:schema:update',
'--em' => $site_name,
'--force' => true
);
$update_schema_input = new ArrayInput($args);
//Run the symfony database create command
$this->getApplication()->run($update_schema_input, $output);
}
}
Matt il tuo suggerimento è azzeccato. Alla fine ho creato una nuova cartella "Servizi" sotto AdminBundle e ho inserito una nuova classe "CommandKernal". Ha funzionato come un fascino. Grazie mille! – lewsid