2011-12-09 4 views
9

En versiones anteriores de Symfony, usted solía ser capaz de construir nuevos objetos dentro de un objeto de datos al extender una clase de modelo con una subclase extendida.¿Cómo extiendes una entidad en Symfony2 como solías poder en Symfony 1?

Por ejemplo, tenía un modelo de cuestionario que tenía una tabla de resultados. Esa tabla de resultados tenía una clase de modelo Result.php que solía establecer y obtener los resultados a través de Doctrine. Luego utilicé la subclase del modelo ResultPeer.php para agregar una nueva función al objeto Result que tomó el resultado y, dependiendo de un conjunto fijo de umbrales, se calculó una puntuación y el color correspondiente.

En la nueva versión de Symfony2 con Doctrine2, estoy luchando por encontrar la mejor manera de hacerlo. Al crear una entidad, solo puedo encontrar en la documentación la capacidad de agregar objetos en función de las relaciones de la estructura de datos.

Miré los repositorios de entidades, pero eso no parece extender o agregar funcionalidad a un objeto original. Parece recuperar objetos de datos basados ​​en consultas que son más complejas que las funciones de consulta estándar.

También miré servicios, que puedo usar para recopilar el objeto y luego usar el objeto crear una nueva matriz que incluye este objeto y los datos recién creados, pero esto no parece correcto o seguir la filosofía de que Symfony se trata de.

¿Alguien sabe cómo se pueden agregar funciones a un objeto de datos existente. Lo encontré realmente útil en la versión anterior de Symfony, pero no puedo encontrar la alternativa en la nueva versión de Symfony2.

Respuesta

18

Extender una entidad es el camino a seguir. En el mundo de Doctrine2, hablan sobre el mapeo de herencia. Aquí un ejemplo de código. Define un BaseEntity y luego se amplía para crear un BaseAuditableEntity y finalmente hay una entidad User que extiende BaseAuditableEntity. El truco es usar la anotación @Orm\MappedSuperclass. Este esquema de herencia creará una sola tabla incluso si hay tres entidades en mi gráfico de relaciones. Esto combinará todas las propiedades en una sola tabla. La tabla creada contiene todas las propiedades asignadas a través de las relaciones, es decir, propiedades de BaseAuditableEntity y del usuario. Aquí los ejemplos de código:

Acme\WebsiteBundle\Entity\BaseEntity.php

namespace Acme\WebsiteBundle\Entity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\MappedSuperclass 
*/ 
class BaseEntity { 

} 

Acme\WebsiteBundle\Entity\BaseAuditableEntity.php

namespace Acme\WebsiteBundle\Entity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\MappedSuperclass 
*/ 
class BaseAuditableEntity extends BaseEntity { 

    private $createdBy; 

    /** 
    * @Orm\Column(type="datetime", name="created_at") 
    */ 
    private $createdAt; 

    /** 
    * @Orm\ManyToOne(targetEntity="User") 
    * @Orm\JoinColumn(name="updated_by", referencedColumnName="id") 
    */ 
    private $updatedBy; 

    /** 
    * @Orm\Column(type="datetime", name="updated_at") 
    */ 
    private $updatedAt; 

    // Setters and getters here 
} 

Acme\WebsiteBundle\Entity\User.php

namespace Acme\WebsiteBundle\Entity; 

use Acme\WebsiteBundle\Entity\BaseAuditableEntity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\Entity(repositoryClass="Acme\WebsiteBundle\Entity\Repository\UserRepository") 
* @Orm\Table(name="acme_user") 
*/ 
class User extends BaseAuditableEntity implements AdvancedUserInterface, \Serializable 
{ 
    /** 
    * @Orm\Id 
    * @Orm\Column(type="integer") 
    * @Orm\GeneratedValue 
    */ 
    private $id; 

    /** 
    * @Orm\Column(type="string", name="first_name") 
    */ 
    private $firstName; 

    /** 
    * @Orm\Column(type="string", name="last_name") 
    */ 
    private $lastName; 

    /** 
    * @Orm\Column(type="string", unique="true") 
    */ 
    private $email; 

    // Other properties 

    // Constructor 

    // Setters and getters 
} 

Aquí un enlace a la documentación oficial de la cartografía herencia de Doctrina 2.1: here

Espero que esto ayude, no dude en comentar si necesita más información.

Saludos,
Matt

+1

Eso es brillante. Sabía que debía haber sido posible. Gracias Matt. –

+0

Supongamos que tengo 'BaseAuditableEntity.php' con la columna' lastName' con nullable = false, y luego al extender la clase a 'User.php'. Necesito cambiar el coulumn anterior. Lastname accept null values ​​(nullable = true). ¿Podrías por favor ayudarme, cómo hacerlo? –

+0

En su clase 'User.php', intente redirigir la propiedad' lastName' y la anotación asociada a ella.Tal vez esto anule lo establecido previamente en la entidad base. Si no funciona, me temo que no puedo ayudar más. Intenta preguntar en la lista de correo de doctrine2. Si encuentra una solución, no dude en informarla aquí. – Matt

Cuestiones relacionadas