Table des matières
http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/php-mapping.html
Doctrine2 vous permet aussi de fournir les métadonnées ORM sous la forme de code PHP en utilisant l'API ClassMetadata. Vous pouvez écrire du code dans les fichiers PHP ou à l'intérieur d'une fonction statique appelée loadMetadata($class) sur la classe entité elle-même.
Si vous souhaitez écrire votre information de cartographie dans les fichiers PHP qui sont nommés d'après l'entité et inclus pour peupler le méta-données pour une entité, vous pouvez le faire en utilisant le PHPDriver:
<?php $driver = new PHPDriver('/path/to/php/mapping/files'); $em->getConfiguration()->setMetadataDriverImpl($driver);
Maintenant, imaginez que nous avions une entité nommée Entities\User et nous avons voulu écrire un fichier de mapping pour l'utiliser au-dessus de l'instance PHPDriver configuré:
<?php namespace Entities; class User { private $id; private $username; }
Pour écrire les informations de cartographie il vous suffit de créer un fichier nommé Entities.User.php à l'intérieur de /path/to/php/mapping/files
<?php // /path/to/php/mapping/files/Entities.User.php $metadata->mapField(array( 'id' => true, 'fieldName' => 'id', 'type' => 'integer' )); $metadata->mapField(array( 'fieldName' => 'username', 'type' => 'string' ));
Maintenant, nous pouvons facilement récupérer l'instance peuplée ClassMetadata où le PHPDriver inclut le fichier et le ClassMetadataFactory il y ait mise en cache pour une utilisation ultérieure:
<?php $class = $em->getClassMetadata('Entities\User'); // or $class = $em->getMetadataFactory()->getMetadataFor('Entities\User');
En plus des fichiers PHP, vous pouvez également spécifier vos informations de cartographie à l'intérieur d'une fonction statique définies sur la classe entité elle-même. Ceci est utile pour le cas où vous voulez garder votre entité et des informations de cartographie ensemble, mais ne veulent pas utiliser les annotations. Pour cela il vous suffit d'utiliser le StaticPHPDriver:
<?php $driver = new StaticPHPDriver('/path/to/entities'); $em->getConfiguration()->setMetadataDriverImpl($driver);
Maintenant vous avez juste besoin de définir une fonction statique loadMetadata($metadata) appelée sur votre entité:
<?php namespace Entities; use Doctrine\ORM\Mapping\ClassMetadata; class User { // ... public static function loadMetadata(ClassMetadata $metadata) { $metadata->mapField(array( 'id' => true, 'fieldName' => 'id', 'type' => 'integer' )); $metadata->mapField(array( 'fieldName' => 'username', 'type' => 'string' )); } }
Pour faciliter l'utilisation de l'API ClassMetadata (qui est très brut) il y a un ClassMetadataBuilder que vous pouvez utiliser.
<?php namespace Entities; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder; class User { // ... public static function loadMetadata(ClassMetadata $metadata) { $builder = new ClassMetadataBuilder($metadata); $builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build(); $builder->addField('username', 'string'); } }
L'API de ClassMetadataBuilder a les méthodes suivantes :
Il a également plusieurs méthodes qui créent des constructeurs (qui sont nécessaires pour les mappages avancés):
La classe ClassMetadataInfo est l'objet de données de base pour stocker les métadonnées de cartographie pour une seule entité. Il contient toutes les getters et setters que vous avez besoin d'alimenter et de récupérer des informations pour une entité.
La classe ClassMetadata s'étend ClassMetadataInfo et ajoute les fonctionnalités d'exécution requis par la doctrine. Il ajoute quelques méthodes supplémentaires liés à la réflexion d'exécution pour travailler avec les entités elles-mêmes.