2011-12-09 10 views
9

Nelle versioni precedenti di Symfony eravate in grado di creare nuovi oggetti all'interno di un oggetto dati estendendo una classe modello con una sottoclasse estesa.Come estendere un'entità in Symfony2 come in passato era possibile usare in Symfony 1?

Ad esempio, avevo un modello di questionario con una tabella dei risultati. Quella tabella dei risultati aveva una classe modello Result.php che usava impostare e ottenere i risultati attraverso Doctrine. Ho quindi utilizzato la sottoclasse del modello ResultPeer.php per aggiungere una nuova funzione all'oggetto Risultato che ha ottenuto il risultato e in base a un set fisso di soglie calcolato un punteggio e il colore corrispondente.

Nella nuova versione di Symfony2 con Doctrine2 sto lottando per trovare il modo migliore per farlo. Durante la creazione di un'entità, nella documentazione è possibile trovare solo la possibilità di aggiungere oggetti in base alle relazioni della struttura dati.

Ho esaminato i repository di entità, ma ciò non sembra estendere o aggiungere funzionalità a un oggetto originale. Sembra riportare gli oggetti dati in base a query più complesse rispetto alle funzioni di query standard.

Ho anche guardato i servizi, che posso utilizzare per raccogliere l'oggetto e quindi usando l'oggetto creare un nuovo array che include questo oggetto e i dati appena creati, ma questo non sembra giusto o seguire la filosofia di Symfony È tutto basato su.

Qualcuno sa come le funzioni possono essere aggiunte a un oggetto dati esistente. L'ho trovato davvero utile nella versione precedente di Symfony, ma non riesco a trovare l'alternativa nella nuova versione di Symfony2.

risposta

18

Estendere un'entità è la strada da percorrere. Nel mondo di Doctrine2, parlano della mappatura dell'eredità. Ecco un esempio di codice. Definisce un BaseEntity quindi viene esteso per creare un BaseAuditableEntity e infine esiste un'entità User che estende BaseAuditableEntity. Il trucco è usare l'annotazione @Orm\MappedSuperclass. Questo schema di ereditarietà creerà una singola tabella anche se ci sono tre entità nel mio grafico delle relazioni. Ciò quindi unirà tutte le proprietà in un'unica tabella. La tabella creata conterrà ogni proprietà mappata attraverso le relazioni, ovvero proprietà da BaseAuditableEntity e User. Qui gli esempi di codice:

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 
} 

Ecco un link alla documentazione ufficiale di Doctrine 2.1 mappatura eredità: here

Spero che questo aiuti, non esitate a commentare se avete bisogno di ulteriori informazioni.

saluti,
Matt

+1

Questo è brillante. Sapevo che doveva essere possibile. Grazie Matt. –

+0

Supponiamo, ho 'BaseAuditableEntity.php' avere la colonna' lastName' con nullable = false, quindi su estendere la classe a 'User.php'. Ho bisogno di cambiare il cognome coulumn precedente accettare valori nulli (nullable = true). Ti prego, aiutami, come si fa? –

+0

Nella tua classe 'User.php', prova a ridefinire la proprietà' lastName' e l'annotazione ad essa associata.Forse questo sostituirà ciò che era stato precedentemente impostato nell'entità di base. Se non funziona, temo di non poter aiutare ulteriormente. Prova a chiedere sulla mailing list doctrine2. Se trovi una soluzione, non esitare a segnalarla qui. – Matt

Problemi correlati