Doctrine 2 : générer les classes PHP depuis la base de données

Créer une entité doctrine directement depuis une base SQL

23 mai 2014

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

CREATE TABLE IF NOT EXISTS `service` (
  `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

./vendor/doctrine/doctrine-module/bin/doctrine-module orm:convert-mapping --namespace="MyNamespace\\Entity\\" --force  --from-database annotation ./modules/MyNamespace/src/

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

namespace MyNamespace\Entity;

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

./vendor/doctrine/doctrine-module/bin/doctrine-module orm:generate-entities ./modules/MyNamespace/src/ --generate-annotations=true

Voici le résultat avec une entité complète et prête à être utilisée :

Une entité doctrine complète

namespace Business\Entity;

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 !

Par
Créateur et administrateur.

Dans la même catégorie

Formater un tableau pour CURLOPT_POSTFIELDS
Email avec pièce jointe en PHP
PHP : modifier les attributs privés d'un objet
Tester l'existence d'un fichier dans l'include path
Convertir récursivement un objet PHP en tableau
PHP : formater un tableau en CSV
Comment envoyer un mail en ligne de commande ?
RSYNC : Comment synchroniser des fichiers à travers une connexion ssh ?
Exécuter un code PHP en ligne de commande
Comment catcher les erreurs en PHP ?
Doctrine 2 : comment afficher la requête SQL ?
Comment construire une URL sans caractères spéciaux en PHP ?
Comment lister les fichiers PHP inclus sur ma page ?
Les fonctions anonymes récursives en PHP
Requête HTTP asynchrone en PHP
La résolution statique à la volée ou Late Static Bindings
Trouver les jours fériés français en PHP
Comment allumer son ordinateur à distance en PHP ?
Comment utiliser la balise meta viewport ?
Une version mobile de mon site avec le Zend Framework
Doctrine et le Zend Framework : Présentation, intégration et utilisation
Créer son flux RSS simplement avec Zend_Feed
Appliquer un layout sur un mail avec le Zend Framework
Comment lancer une requête multi-bases avec les fonctions MySQL ?
Implode / Explode : Du tableau à la chaine de caractères, de la chaine de caractères au tableau

Commentaire(s)