Ajouter les lignes de commande Doctrine2 à Symfony2
Doctrine2 fournis dans sa ligne de commande la fonction orm:validate-schema qui permet de vérifier qu'il n'y a pas d'erreur dans la déclaration des associations entre les Entities. Cette fonction permet aussi de vérifier si le schema et la base de données sont synchronisés. Je trouve cette ligne de commande indispensable. J'ai donc entrepris de l'ajouter à la ligne de commande Symfony, ce qui finalement a été relativement simple.
Dans un bundle, j'ai créé un dossier Command, puis une class MyValidateSchemaCommand.php qui étend la class ValidateSchemaCommand de Doctrine.
<?php namespace Lp\LibBundle\Command; use Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand; class MyValidateSchemaCommand extends ValidateSchemaCommand { }
J'ai ensuite surchargé la fonction configure() pour ajouter la ligne de commande dans le namespace doctrine de la ligne de commande de sf2.
protected function configure() { parent::configure(); $this->setName('doctrine:orm:validate-schema'); }
Reste le problème du chargement de l'Entity Manager qui est manquant. Dans la class de Doctrine la fonction execute() fait appel au Helper('em') qui n'est pas définis et renvoie une exception. Il faut donc associer l'Entity Manager au Helper:
<?php namespace Lp\LibBundle\Command; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Bundle\DoctrineBundle\Command\Proxy\DoctrineCommandHelper; use Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand; class MyValidateSchemaCommand extends ValidateSchemaCommand { /** * (non-PHPdoc) * @see Tools/Console/Command/Doctrine\ORM\Tools\Console\Command.ValidateSchemaCommand::configure() * * Modifie le Nom de la commande pour quelle soit dans le namespace Doctrine * Ajoute le Helper em pour l'entity manager qui n'est pas définis dans la class Doctrine * @author ulrich, 09/09/11 */ protected function configure() { parent::configure(); $this->setName('doctrine:orm:validate-schema'); $this->addOption('em', null, InputOption::VALUE_OPTIONAL, 'The entity manager to use for this command'); } /** * (non-PHPdoc) * @see Tools/Console/Command/Doctrine\ORM\Tools\Console\Command.ValidateSchemaCommand::execute() * * Ajoute le Helper em pour l'entity manager qui n'est pas définis dans la class Doctrine * @author ulrich, 09/09/11 */ protected function execute(InputInterface $input, OutputInterface $output) { DoctrineCommandHelper::setApplicationEntityManager($this->getApplication(), $input->getOption('em')); return parent::execute($input, $output); } }
Il ne reste plus qu'à appeler la console avec la bonne option pour valider son schema.
> php app/console doctrine:orm:validate-schema
Réponse de Ulrich le 27 juil. 2012