2012-09-22 13 views
6

Jestem całkiem nowy dla ZF2. Mam kilka elementów doktryn z mojego projektu w ZF1, z których jedna jest jednostką użytkownika.Rozszerzanie jednostki użytkownika ZfcUserDoctrineORM w ZF2

Próbuję rozszerzyć \ ZfcUserDoctrineORM \ Entity \ User, aby móc skrócić moje stare relacje - ale bez wielkiego sukcesu.

Jeśli spróbuję uruchomić generator schematów ./doctrine-module orm:schema-tool:create, pojawia się błąd informujący, że nazwa tabeli już istnieje.

Dotychczas Próbowałem rozszerzenie klasy i ustawienie moją klasę jako UserEntityClass

return array(
    'zfcuser' => array(
     'UserEntityClass' => '\Application\Entity\User', 
    ), 
); 

Nie doen't wydają się być wszelka dokumentacja dla modułu jak dotychczas.

Odpowiedz

7

Problem polegał na tym, że domyślne jednostki ZfcUserDoctrineORM wciąż były w grze. Aby rozwiązać ten problem, możesz ustawić wartość EnableDefaultEntities na false:

return array(
    'zfcuser' => array(
     'UserEntityClass' => '\Acme\Entity\User', 
     'EnableDefaultEntities' => false 
    ), 
); 
2

Wychodzę z pamięci tutaj, kiedy bawiłem się z ZfcUser [DoctrineORM] jakiś czas temu.

Nie chcesz niczego przedłużyć. Zamiast tego po prostu napisz swoją własną jednostkę użytkownika i zmodyfikuj ją za pomocą ZfcUser \ Entity \ UserInterface.

Następnie upewnij się, że ustawiłeś poprawnie swoją konfigurację (aby użyć własnej implementacji UserInterface zamiast domyślnej) i powinieneś być gotowy.

+0

Cześć timdev, właśnie tego obecnie próbuję. Mam glob plik konfiguracyjny w /config/autoload/ZfcUserDoctrineORM.global.php 'tablicy powrotnej ( 'zfcuser' => array ( 'UserEntityClass' => '\ WriplCom \ Jednostka \ użytkownik', ) ); "Mam przeczucie, że moim problemem jest albo mój plik konfiguracyjny, albo jestem ambitny, próbując uzyskać narzędzie cli doktryny do wygenerowania schematu, albo jedno i drugie. – briangallagher

0

Chociaż odpowiedź OP jest poprawna, nie jest kompletna. Poniżej co zrobiłem i dlaczego.

Utwórz własną jednostkę użytkownika. Klasa abstrakcyjna jest używana dla wszystkich moich jednostek, zawiera tylko właściwość ID, obiekty pobierające/ustawiające i niektóre globalne funkcje debugowania jednostek.

User.php

use Doctrine\ORM\Mapping as ORM; 
use Keet\Mvc\Entity\AbstractEntity; 
use ZfcUser\Entity\UserInterface; 

/** 
* Entity Class representing a post of our User module. 
* 
* @ORM\Entity 
* @ORM\Table(name="users") 
* @ORM\Entity(repositoryClass="Keet\User\Repository\UserRepository") 
* @ORM\HasLifecycleCallbacks 
*/ 
class User extends AbstractEntity implements UserInterface 
{ 
    /** 
    * @var string 
    * @ORM\Column(name="username", type="string", length=255, unique=true, nullable=false) 
    */ 
    protected $username; 

    /** 
    * @var string 
    * @ORM\Column(name="email", type="string", length=255, unique=true, nullable=false) 
    */ 
    protected $email; 

    /** 
    * @var string 
    * @ORM\Column(name="display_name", type="string", length=255, nullable=false) 
    */ 
    protected $displayName; 

    /** 
    * @var string 
    * @ORM\Column(name="`password`", type="string", length=255, nullable=false) 
    */ 
    protected $password; 

    /** 
    * @var int 
    * @ORM\Column(name="state", type="integer", length=3, nullable=false) 
    */ 
    protected $state = 1; 

    // Getters/Setters 
} 

zfcuser.config.php

Zawiera ten sam config jako OP's answer:

'zfcuser' => [ 
    //Some other config 
    'userEntityClass' => User::class, 
    'EnableDefaultEntities' => false, 
], 

module.config.php

WAŻNE: Zastąp domyślną konfigurację encji doktryny zfcuser!

'doctrine' => [ 
    'orm_autoload_annotations' => true, 
    'driver' => [ 
     __NAMESPACE__ . '_driver' => [ 
      'class' => 'Doctrine\\ORM\\Mapping\\Driver\\AnnotationDriver', 
      'cache' => 'array', 
      'paths' => [ 
       __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'src' 
       . DIRECTORY_SEPARATOR . 'Entity', 
      ] 
     ], 
     'orm_default'    => [ 
      'drivers' => [ 
       __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver', 
       'ZfcUser\Entity' => __NAMESPACE__ . '_driver' 
      ], 
     ], 
     'zfcuser_entity' => [ // Section overwrites the default config for location of Annotation. Original found 
      // in vendor ZfcUserDoctrineModule /config/xml/zfcuser/ZfcUser.Entity.User.dcm.xml 
      'class' => 'Doctrine\\ORM\\Mapping\\Driver\\AnnotationDriver', 
      'paths' => 
       __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'src' 
       . DIRECTORY_SEPARATOR . 'Entity', 
     ], 
    ], 
], 

W powyższym was, że zwykle po prostu mają 'driver' i 'orm_default' configs. Moduł ZfcUser zawiera konfigurację 'zfcuser_entity', ale wskazuje ją sterownikowi we własnym module. Aby nie mieć pływającego odniesienia do innego sterownika, należy go zastąpić i skierować w stronę zdefiniowanego sterownika, zdefiniowanego przez __NAMESPACE__ . '_driver'. Ponadto w moim przykładzie używam AnnotationDriver do czytania adnotacji, natomiast moduł ZfcUser używa XmlDriver.ZfcUser moduł konfiguracyjny poniżej

Jest to oryginalny config, nadpisane w powyższym przykładzie

'zfcuser_entity' => array(
    'class' => 'Doctrine\ORM\Mapping\Driver\XmlDriver', 
    'paths' => __DIR__ . '/xml/zfcuser' 
), 

Ta konfiguracja pozwala w pełni korzystać z własnego podmiotu, ale nadal korzystać z modułu ZfcUser.

W moim przypadku mogę użyć własnego AbstractActionController z moimi własnymi zapisami CRUD, które oczekują dziecka o numerze AbstractEntity. Oszczędza to dużo pisania/myślenia;)