2011-12-09 3 views
9

W starszych wersjach Symfony można było budować nowe obiekty w obiekcie danych, rozszerzając klasę modelu na rozszerzoną podklasę.W jaki sposób rozszerzasz jednostkę w Symfony2, tak jak kiedyś w Symfony 1?

Na przykład miałem model ankiety, który miał tabelę wyników. Ta tabela wyników miała klasę modelu Result.php, która służyła do ustawiania i otrzymywania wyników za pomocą Doctrine. Następnie użyłem podklasy modelu ResultPeer.php, aby dodać nową funkcję do obiektu Result, który przyjął wynik i w zależności od ustalonego zestawu progów obliczył wynik i odpowiadający mu kolor.

W nowej wersji Symfony2 przy użyciu Doctrine2 staram się wypracować najlepszy sposób na zrobienie tego. Podczas tworzenia obiektu mogę jedynie znaleźć w dokumentacji możliwość dodawania obiektów w oparciu o relacje struktury danych.

Zajrzałem do repozytoriów encji, ale to nie wydaje się rozszerzać ani dodawać funkcjonalności do oryginalnego obiektu. Wydaje się, że przywraca obiekty danych na podstawie zapytań, które są bardziej złożone niż standardowe funkcje zapytań.

Przyjrzałem się również usługom, które mogę wykorzystać do zebrania obiektu, a następnie za pomocą obiektu utworzyć nową tablicę, która zawiera ten obiekt i nowo utworzone dane, ale to po prostu nie wydaje się właściwe lub postępuj zgodnie z filozofią Symfony chodzi o wszystko.

Czy ktoś wie, w jaki sposób funkcje można dodać do istniejącego obiektu danych. Zauważyłem, że jest to przydatne w starszej wersji Symfony, ale nie może znaleźć alternatywy w nowej wersji Symfony2.

Odpowiedz

18

Poszerzenie jednostki jest drogą do zrobienia. W świecie Doctrine2 mówią o mapowaniu dziedziczenia. Oto przykład kodu. Definiuje on BaseEntity, a następnie jest rozszerzony, aby utworzyć BaseAuditableEntity i ostatecznie istnieje jednostka rozszerzająca BaseAuditableEntity. Sztuką jest użycie adnotacji @Orm\MappedSuperclass. Ten schemat dziedziczenia utworzy pojedynczą tabelę, nawet jeśli na moim wykresie relacji znajdują się trzy jednostki. Spowoduje to połączenie wszystkich właściwości w jedną tabelę. Utworzona tabela będzie zawierała każdą właściwość odwzorowaną przez relacje, tj. Właściwości z BaseAuditableEntity i od użytkownika. Tutaj przykłady kodu:

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 
} 

Oto link do oficjalnej dokumentacji mapowania Dziedziczenie Nauki 2.1: here

Mam nadzieję, że to pomoże, nie wahaj się komentować, jeśli potrzebujesz więcej informacji.

Pozdrawiam,
Matt

+1

To jest genialne. Wiedziałem, że to musiało być możliwe. Dzięki Matt. –

+0

Załóżmy, że mam 'BaseAuditableEntity.php' ma kolumnę' lastName' z nullable = false, a następnie rozszerzenie klasy na 'User.php'. Muszę zmienić powyższe nazwisko w klastrze, zaakceptuj wartości null (nullable = true). Czy pomożesz mi, jak to zrobić? –

+0

W swojej klasie "User.php', spróbuj zredefiniować właściwość' lastName' i powiązaną z nią adnotację.Może to zastąpi to, co zostało wcześniej ustawione w jednostce podstawowej. Jeśli to nie zadziała, obawiam się, że nie mogę pomóc dalej. Spróbuj zapytać na liście dyskusyjnej doctrine2. Jeśli znajdziesz rozwiązanie, nie wahaj się zgłosić go tutaj. – Matt

Powiązane problemy