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

 

Il y a 3 commentaires

  • Elouafi07-27-2012 13:33:51

    salut ,
    la commande ' php app/console doctrine:orm:validate-schema' ne marche plus avec Sf2 ??

  • Ulrich07-27-2012 14:18:57

    Bonjour,
    Je n'ai pas ce qu'il faut pour tester maintenant, mais en regardant les sources de sf2.1 beta2 la déclaration du namespace de la classe DoctrineCommandHelper est différent. La source d'erreur est peut être là. Dans mon code il faut remplacer la ligne 'use Symfony\Bundle\DoctrineBundle\Command\Proxy\DoctrineCommandHelper;' par 'use Doctrine\Bundle\DoctrineBundle\Command\Proxy\DoctrineCommandHelper;'
    Ulrich

  • ELouafi07-27-2012 17:31:05

    Bonjour tt le monde,
    comment acceder a la cle etrangere dans une entite depuis son Repository .