Vous souhaitez utiliser Doctrine 2 sans passer par un format type YAML ?
Ce tutoriel explique comment générer directement les classes de vos entités doctrine en parcourant (reverse engineering) une base de données SQL.
Toutes les commandes ci-dessous doivent être lancées depuis le dossier du projet : cd chemin_vers_projet.
Je vais générer les classes dans le dossier chemin_vers_projet/modules/MyNamespace/src/MyNamespace/Entity. Mon autoloader étant PSR-0, elles appartiendront au namespace MyNamespace\Entity.
Mon exemple se basera sur cette table :
La table qui servira d'exemple
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(127) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Générer une entité au format PHP
Si une erreur survient, je vous conseille d'ouvrir chemin_vers_projet/vendor/doctrine/doctrine-module/bin/doctrine-module.php et de remplacer dirname(getcwd())
par le chemin vers le projet.
Après avoir réussi à exécuter cette commande vous devriez avoir une classe avec des attributs et des annotations :
Une entité doctrine basique
use Doctrine\ORM\Mapping as ORM;
/**
* MyNamespace\Entity\Service
*
* @ORM\Table(name="service")
* @ORM\Entity
*/
class Service
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string $name
*
* @ORM\Column(name="name", type="string", length=127, nullable=false)
*/
private $name;
}
Nous allons maintenant générer automatiquement les accesseurs vers les attributs de cette classe.
Générer les getters et setters
Voici le résultat avec une entité complète et prête à être utilisée :
Une entité doctrine complète
use Doctrine\ORM\Mapping as ORM;
/**
* Business\Entity\Service
*
* @ORM\Table(name="service")
* @ORM\Entity
*/
class Service
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string $name
*
* @ORM\Column(name="name", type="string", length=127, nullable=false)
*/
private $name;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return Service
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
}
Je n'ai testé qu'avec un système de bases de données relationnelles mais je pense que ça fonctionne aussi avec du MongoDB par exemple. Si quelqu'un a déjà testé, ça serait sympa de laisser un commentaire.
A bientôt !
Commentaire(s)