Annotations de référence Symfony2


Table des matières


Référence

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/annotations-reference.html#annref-postremove

Dans ce chapitre, une référence des annotations de doctrine 2 est donnée avec de brèves explications sur leur contexte et leur utilisation.

@Column

Marque une variable d’instance annoté comme “persistante”. Il est à l’intérieur de variables d’instance le commentaire PHP DocBlock. Toute valeur à l’intérieur de cette variable sera sauvegardés et chargée de la base de données dans le cadre du cycle de vie des variables d’instance entité de classe.

Les attributs obligatoires:

  • type: Nom du type de doctrine qui est transformé entre PHP et base de données de représentation.

Attributs optionnels:

  • name: Par défaut le nom de la propriété est utilisée pour le nom de colonne de base aussi, cependant l’attribut ‘name’ vous permet de déterminer le nom de colonne.
  • lenght: Utilisé par le type “String” pour déterminer sa longueur maximale de la base. Doctrine ne valide pas la longueur d’un chaîne de valeur pour vous.
  • precision: La précision d’une décimale (exacte numérique) colonne (S’applique uniquement pour la colonne décimal)
  • scale: l’échelle d’une décimale (exacte numérique) colonne (S’applique uniquement pour la colonne décimal)
  • unique: valeur booléenne pour déterminer si la valeur de la colonne doit être unique à travers toutes les lignes de la table sous-jacente des entités.
  • nullable: Détermine si les valeurs NULL autorisées pour cette colonne.
  • columnDefinition: DDL SQL extrait qui débute après le nom de colonne et précise la définition de colonne complète (non-portable!). Cet attribut permet d’utiliser des fonctionnalités avancées RMDBS. Cependant vous devriez faire une utilisation prudente de cette fonctionnalité et les conséquences. SchemaTool ne sera pas de détecter les changements sur la colonne plus correctement si vous utilisez “columnDefinition”.

De plus vous devriez vous rappeler que l’attribut «Type» gère le projet de conversion entre PHP et base de données des valeurs. Si vous utilisez cet attribut sur ​​une colonne qui est utilisée pour les jointures entre les tables, vous devriez aussi jeter un oeil à @JoinColumn .

Exemples:

<?php
/**
 * @Column(type="string", length=32, unique=true, nullable=false)
 */
protected $username;

/**
 * @Column(type="string", columnDefinition="CHAR(2) NOT NULL")
 */
protected $country;

/**
 * @Column(type="decimal", precision=2, scale=1)
 */
protected $height;

@ChangeTrackingPolicy

Le suivi des modifications d’annotation de police permet de spécifier comment Doctrine2 UnitOfWork détecte les changements dans les propriétés des entités durant le flush(). Par défaut, chaque entité est vérifiée conformément à une stratégie implicite différé, ce qui signifie que le flush d’UnitOfWork compare toutes les propriétés d’une entité à un instantané précédemment stockées. Cela fonctionne hors de la boîte, mais vous voudrez peut-être ajuster le rendement de chasse où l’utilisation d’une autre politique de suivi des modifications pourrait être une option intéressante.

Les détails sur toutes les politiques disponibles sur le suivi des modifications peut être trouvée dans la section de configuration.

Exemple:

<?php
/**
 * @Entity
 * @ChangeTrackingPolicy("DEFERRED_IMPLICIT")
 * @ChangeTrackingPolicy("DEFERRED_EXPLICIT")
 * @ChangeTrackingPolicy("NOTIFY")
 */
class User {}

@DiscriminatorColumn

Cette annotation est une annotation requise pour la super classe la plus haute d’une hiérarchie d’héritage. Il précise les détails de la colonne qui enregistre le nom de la classe, où l’entité est réellement instancié ainsi.

Les attributs obligatoires:

  • name: Le nom de colonne du discriminateur. Ce nom est également utilisé lors de l’hydratation Array comme clé pour spécifier le nom de classe.

Attributs optionnels:

  • type: Par défaut, c’est une string
  • lenght: Par défaut, c’est 255.

@DiscriminatorMap

La carte discriminateur est une annotation requise sur la classe top-most/super dans une hiérarchie d’héritage. Elle prend un tableau comme argument pour la classe qui définit ce qui doit être enregistré en vertu de laquelle du nom de la base. Les clés sont la valeur et les valeurs données sont des classes, que ce soit entièrement ou en tant que noms de classes non qualifiés, selon que les classes soient dans le namespace ou non.

<?php
/**
 * @Entity
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
 */
class Person
{
    // ...
}

@Entity

Nécessaire d’annotation pour marquer une classe PHP comme entité. Doctrine gère la persistance de toutes les classes marquées comme entité.

Attributs optionnels:

  • repositoryClass: Indique l’FQCN d’une sous-classe de l’EntityRepository. Utilisation des référentiels pour les entités sont encouragées à garder spécialisés DQL et opérations SQL séparée de la couche Modèle / Domaine.
  • readonly: (> = 2.1) précise que cette entité est marqué en lecture seule et n’est pas prise en compte pour le suivi des modifications. Les entités de ce type peuvent être persistantes et supprimées.

Exemple:

<?php
/**
 * @Entity(repositoryClass="MyProject\UserRepository")
 */
class User
{
    //...
}

@GeneratedValue

Indique quelle stratégie est utilisée pour générer des identifiants pour une variable d’instance qui est annotée par @Id . Cette annotation est facultative et n’a de sens que lorsqu’il est utilisé en conjonction avec @Id.

Si cette annotation n’est pas spécifié avec @Id, la stratégie NONE est utilisé par défaut.

Les attributs obligatoires:

  • strategy: Définit le nom de la stratégie de génération d’identifiant. Les valeurs valides sont AUTO, SEQUENCE, TABLE, IDENTITY et NONE.

Exemple:

<?php
/**
 * @Id
 * @Column(type="integer")
 * @generatedValue(strategy="IDENTITY")
 */
protected $id = null;

@HasLifecycleCallbacks

Annotation qui doit être mis sur le DocBlock entité classe PHP pour notifier à Doctrine que cette entité a les annotations entity life-cycle callback mis sur au moins une de ses méthodes. Utiliser @PostLoad, @PrePersist, @PostPersist, @PreRemove, @PostRemove, @PreUpdate ou @PostUpdate. Sans cette annotation marqueur Doctrine ignorera les rappels.

<?php
/**
 * @Entity
 * @HasLifecycleCallbacks
 */
class User
{
    /**
     * @PostPersist
     */
    public function sendOptinMail() {}
}

@Index

Les annotations sont utilisées à l’intérieur de l’annotation @Table sur le niveau de l’entité de classe. Il permet de faire allusion au SchemaTool pour générer un indice de base de données sur les colonnes du tableau spécifié. Elle n’a de sens que dans le contexte SchemaTool génération de schéma.

Les attributs obligatoires:

  • name: Nom de l’indice
  • columns: tableau de colonnes.

Exemple:

<?php
/**
 * @Entity
 * @Table(name="ecommerce_products",indexes={@index(name="search_idx", columns={"name", "email"})})
 */
class ECommerceProduct
{
}

@Id

La variable d’instance annotée sera marquée comme identification de l’entité, la clé primaire dans la base de données. Cette annotation est un marqueur seulement et n’a pas d’attributs obligatoires ou facultatifs. Pour les entités qui ont des colonnes multiples d’identifiants chaque colonne doit être marqués avec @Id.

Exemple:

<?php
/**
 * @Id
 * @Column(type="integer")
 */
protected $id = null;

@InheritanceType

Dans une hiérarchie d’héritage vous avez à utiliser cette annotation sur la super classe la plus haute pour définir la stratégie qui doit être utilisé pour l’héritage. Actuellement une seule table et l’Héritage de Table de classe sont pris en charge.

Cette annotation est toujours utilisée en conjonction avec les annotations @DiscriminatorMap et @DiscriminatorColumn.

Exemples:

<?php
/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
 */
class Person
{
    // ...
}

/**
 * @Entity
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
 */
class Person
{
    // ...
}

@JoinColumn

Cette annotation est utilisé dans le contexte des relations de @ManyToOne , @OneToOne et dans le contexte de @JoinTable imbriquée dans une @ManyToMany. Cette annotation n’est pas nécessaire. Si le nom des attributs n’est pas précisé et que referencedColumnName sont déduites de la table et des noms de clef primaire.

Les attributs obligatoires:

  • name: Nom de la colonne qui contient l’identifiant de clé étrangère à cette relation. Dans le contexte de @JoinTable il spécifie le nom de colonne dans la table de jointure.
  • referencedColumnName: Nom de l’identificateur de clé primaire qui est utilisée pour l’assemblage de cette relation.

Attributs optionnels:

  • unique: Détermine si cette relation exclusive entre les entités concernées doivent être appliquées de la même façon sur le niveau de contrainte base de données. Par défaut à false.
  • nullable: Détermine si l’entité liée est nécessaire, ou si nulle est un état ​​autorisé pour la relation. Par défaut à true.
  • onDelete: action en cascade (niveau base de données)
  • columnDefinition: DDL SQL extrait qui débute après le nom de colonne et précise la définition de colonne complète (non-portable!). Cet attribut permet d’utiliser des fonctionnalités avancées RMDBS. En utilisant cet attribut sur @JoinColumn nécessaire, si vous avez besoin des définitions de colonnes légèrement différent pour rejoindre les colonnes, par exemple concernant NULL/NOT NULL par défaut. Cependant, par défaut un attribut “columnDefinition” sur ​​@Column définit également le rapport @JoinColumn de columnDefinition. Cela est nécessaire pour réaliser le travail sur les clefs étrangères.

Exemple:

<?php
/**
 * @OneToOne(targetEntity="Customer")
 * @JoinColumn(name="customer_id", referencedColumnName="id")
 */
private $customer;

@JoinColumns

Un tableau de @JoinColumn pour les relations @ManyToOne ou @OneToOne avec une entité qui a des identifiants multiples.

@JoinTable

L’utilisation de @OneToMany ou @ManyToMany sur le côté possédant la relation, nécessite de spécifier l’annotation @JoinTable qui décrit les détails de la base de données table de jointure. Si vous ne spécifiez pas @JoinTable sur ces relations par défaut la cartographie raisonnables s’applique à l’aide de la table concernée et les noms de colonnes.

Les attributs obligatoires:

  • name: Base de données Nom de la jointure de table
  • joinColumns: Un tableau d’annotations @JoinColumn décrivant le join-relation entre la table et les entités détenant table de jointure.
  • inverseJoinColumns: Un tableau d’annotations @JoinColumn décrivant le join-relation entre la table inverse entités et table de jointure.

Exemple:

<?php
/**
 * @ManyToMany(targetEntity="Phonenumber")
 * @JoinTable(name="users_phonenumbers",
 *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@JoinColumn(name="phonenumber_id", referencedColumnName="id", unique=true)}
 * )
 */
public $phonenumbers;

@ManyToOne

Définit la variable d’instance annotée contient une référence qui décrit une relation many-to-one entre deux entités.

Les attributs obligatoires:

  • targetEntity: FQCN de l’entité cible référencé. Peut-être le nom de classe non qualifiés si les deux classes sont dans le même espace. IMPORTANT: Pas de barre oblique inverse de tête!

Attributs optionnels:

  • cascade: Cascade Option
  • fetch: LAZY ou EAGER
  • inversedBy – L’attribut inversedBy désigne le champ dans l’entité qui est le côté inverse de la relation.

Exemple:

<?php
/**
 * @ManyToOne(targetEntity="Cart", cascade={"all"}, fetch="EAGER")
 */
private $cart;

@ManyToMany

Définit une variable d’instance est titulaire d’une relation many-to-many entre deux entités. @JoinTable est une annotation facultative qui a des configurations par défaut en utilisant la table et les noms des deux entités connexes.

Les attributs obligatoires:

  • targetEntity: FQCN de l’entité cible référencé. Peut-être le nom de classe non qualifiés si les deux classes sont dans le même espace. IMPORTANT: Pas de barre oblique inverse de tête!

Attributs optionnels:

  • mappedBy: Cette option spécifie le nom de propriété sur le targetEntity qui est du côté possédant cette relation. C’est un attribut requis pour le côté inverse d’une relation.
  • inversedBy: L’attribut inversedBy désigne le champ dans l’entité qui est le côté inverse de la relation.
  • cascade: Cascade Option
  • fetch: LAZY, EXTRA_LAZY ou EXTRA_LAZY
  • indexBy: Indice de la collection par un champ sur l’entité cible.

Pour les relations bidirectionnelles ManyToMany chaque côté peut être le côté propriétaire (le côté qui définit le @JoinTable et / ou ne pas faire usage de l’attribut mappedBy, utilisant ainsi une jointure par défaut de table).

Exemple:

<?php
/**
 * Owning Side
 *
 * @ManyToMany(targetEntity="Group", inversedBy="features")
 * @JoinTable(name="user_groups",
 *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@JoinColumn(name="group_id", referencedColumnName="id")}
 *      )
 */
private $groups;

/**
 * Inverse Side
 *
 * @ManyToMany(targetEntity="User", mappedBy="groups")
 */
private $features;

@MappedSuperclass

Un mappés est une super classe abstraite ou concrète qui fournit l’état d’une entité persistante et d’information pour la cartographie de ses sous-classes, mais qui n’est pas en soi une entité. Cette annotation est spécifiée sur le bloc de documentation de classe et n’a aucun des attributs supplémentaires.

L’annotation @MappedSuperclass ne peut pas être utilisé en conjonction avec @Entity. Voir la section Mapping de l’héritage pour plus de détails sur les restrictions de superclasses mappée .

Attributs optionnels:

  • repositoryClass: (> = 2.2) Indique le FQCN d’une sous-classe de l’EntityRepository. Cela va être hérité de tous les sous-classes de cette superclasse mappés.

Exemple:

<?php
/** @MappedSuperclass */
class MappedSuperclassBase
{
    // ... fields and methods
}

/** @Entity */
class EntitySubClassFoo extends MappedSuperclassBase
{
    // ... fields and methods
}

@OneToOne

L’annotation @OneToOne fonctionne presque exactement comme le @ManyToOne avec une option supplémentaire qui peut être spécifié. La configuration par défaut pour @JoinColumn utilisant la table de l’entité cible et primaire noms de colonnes clés s’appliquent ici aussi.

Les attributs obligatoires:

  • targetEntity: FQCN de l’entité cible référencé. Peut-être le nom de classe non qualifiés si les deux classes sont dans le même espace. IMPORTANT: Pas de barre oblique inverse de tête!

Attributs optionnels:

  • cascade: Cascade Option
  • fetch: Une des LAZY ou EAGER
  • orphanRemoval: Boolean qui spécifie si les orphelins, les entités OneToOne inverse qui ne sont pas connectés à tout propriétaire de l’instance, doit être retiré par la doctrine. Par défaut à false.
  • inversedBy: L’attribut inversedBy désigne le champ dans l’entité qui est le côté inverse de la relation.

Exemple:

<?php
/**
 * @OneToOne(targetEntity="Customer")
 * @JoinColumn(name="customer_id", referencedColumnName="id")
 */
private $customer;

@OneToMany

Les attributs obligatoires:

  • targetEntity: FQCN de l’entité cible référencé. Peut-être le nom de classe non qualifiés si les deux classes sont dans le même espace. IMPORTANT: Pas de barre oblique inverse de tête!

Attributs optionnels:

  • cascade: Cascade Option
  • orphanRemoval: Boolean qui spécifie si les orphelins, les entités OneToOne inverse qui ne sont pas connectés à tout propriétaire de l’instance, doit être retiré par la doctrine. Par défaut à false.
  • mappedBy: Cette option spécifie le nom de propriété sur le targetEntity qui est du côté possédant cette relation. C’est un attribut requis pour le côté inverse d’une relation.
  • fetch: LAZY, EXTRA_LAZY, ou EXTRA_LAZY.
  • indexBy: Indice de la collection par un champ sur l’entité cible.

Exemple:

<?php
/**
 * @OneToMany(targetEntity="Phonenumber", mappedBy="user", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
 */
public $phonenumbers;

@OrderBy

Annotations en option qui peut être spécifiée avec un @ManyToMany ou @OneToMany annotation à préciser par quels critères la collection devrait être extraites de la base de données en utilisant une clause ORDER BY.

Cette annotation nécessite une seule valeur non attribuée avec un extrait de DQL:

Exemple:

<?php
/**
 * @ManyToMany(targetEntity="Group")
 * @OrderBy({"name" = "ASC"})
 */
private $groups;

L’extrait de DQL OrderBy est seulement autorisée à se composer des des noms de domaine non cotées et d’une option de position ASC/DESC. Plusieurs champs sont séparés par une virgule (,) Les noms des champs référencés existent sur la classe targetEntity @ManyToMany ou @OneToMany annotation.

@PostLoad

Marque une méthode sur l’entité appelait par un événement @postPersist. Fonctionne uniquement avec @HasLifecycleCallbacks dans l’entité de classe PHP DocBlock.

@PostPersist

Marque une méthode sur l’entité appelait par un événement @PostPersist. Fonctionne uniquement avec @HasLifecycleCallbacks dans l’entité de classe PHP DocBlock.

@PostRemove

Marque une méthode sur l’entité appelait par un événement @postRemove. Fonctionne uniquement avec @HasLifecycleCallbacks dans l’entité de classe PHP DocBlock.

@PostUpdate

Marque une méthode sur l’entité appelait par un événement @PostUpdate. Fonctionne uniquement avec @HasLifecycleCallbacks dans l’entité de classe PHP DocBlock.

@PrePersist

Marque une méthode sur l’entité appelait par un événement @PrePersist. Fonctionne uniquement avec @HasLifecycleCallbacks dans l’entité de classe PHP DocBlock.

@PreRemove

Marque une méthode sur l’entité appelait par un événement @preRemove. Fonctionne uniquement avec @HasLifecycleCallbacks dans l’entité de classe PHP DocBlock.

@PreUpdate

Marque une méthode sur l’entité appelait par un événement @PreUpdate. Fonctionne uniquement avec @HasLifecycleCallbacks dans l’entité de classe PHP DocBlock.

@SequenceGenerator

Pour l’utiliser avec @GeneratedValue (stratégie = “séquences”) cette annotation permet de spécifier des détails sur la séquence, comme la taille de l’incrément et les valeurs initiales de la séquence.

Les attributs obligatoires:

  • sequenceName: Nom de la séquence

Attributs optionnels:

  • allocationSize: Incrémente la séquence par la taille de l’allocation lorsque son récupérées. Une valeur supérieure à 1 permet d’optimiser les scénarios où vous créez plus d’une entité nouvelle par demande. Par défaut à 10
  • initialValue: D’où vient la séquence de démarrage, par défaut à 1.
<?php
/**
 * @Id
 * @GeneratedValue(strategy="SEQUENCE")
 * @Column(type="integer")
 * @SequenceGenerator(sequenceName="tablename_seq", initialValue=1, allocationSize=100)
 */
protected $id = null;

@Table

Annotation décrit la table d’une entité persistante. Il est placé sur le DocBlock entité classe PHP et est facultatif. Si cela n’est pas spécifié, le nom de table par défaut sera le nom de classe d’entités non qualifiés.

Les attributs obligatoires:

  • name: Nom de la table

Attributs optionnels:

<?php
/**
 * @Entity
 * @Table(name="user",
 *      uniqueConstraints={@UniqueConstraint(name="user_unique",columns={"username"})},
 *      indexes={@Index(name="user_idx", columns={"email"})}
 * )
 */
class User { }

@UniqueConstraint

Les annotations sont utilisées à l’intérieur de l’annotation @Table sur le niveau de l’entité de classe. Il permet à SchemaTool de générer une base de données unique sur les colonnes de la table spécifiée. Elle n’a de sens que dans le contexte SchemaTool génération de schéma.

Les attributs obligatoires:

  • name: Nom de l’indice
  • columns: tableau de colonnes.

Exemple:

<?php
/**
 * @Entity
 * @Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})})
 */
class ECommerceProduct
{
}

@Version

Marqueur d’annotation qui définit une colonne spécifiée comme attribut version utilisée dans un scénario de verrouillage optimiste. Il ne fonctionne que sur les @Column annotations qui ont le type integer ou datetime. La combinaison de @Version avec @Id n’est pas supporté.

Exemple:

<?php
/**
 * @column(type="integer")
 * @version
 */
protected $version;