2012-11-01 19 views
6

Dodałem moduł ZfcUser w mojej aplikacji Zend Framework 2. Ale muszę użyć istniejącej tabeli bazy danych, , która ma nieco inne nazwy kolumn niż domyślna struktura tabeli dla ZfcUser.ZF2: Niestandardowy program odwzorowujący użytkownika dla modułu ZfcUser

W ZfcUser wiki page mówi, że możliwe jest użycie niestandardowego programu odwzorowującego, jeśli mój model nie jest zgodny z podanym interfejsem. Ponieważ moja tabela bazy danych różni się od domyślnej, moja klasa jednostek użytkownika jest również inna niż standardowa ZfcUser \ Entity \ User. Ale mogę powiedzieć ZfcUser pracować z własną klasą łatwo nadrzędnymi ustawienie w pliku konfiguracyjnym /autoload/zfcuser.global.php:

'user_entity_class' => 'MyApp\Entity\MyUser', 

`ve ale nie znalazł w łatwy sposób do powiedzenia ZfcUser używaj mojej klasy mappera do tej pory.

Mam tylko okazało się, że odwzorowujący jest tworzony przez ZfcUser \ Module :: getServiceConfig() wewnątrz której, widzę element odwzorowujący jest zwracany z jego funkcji fabryczne:

// ... 
public function getServiceConfig() 
{ 
    return array(
    // ... 
     'factories' => array(
      // ... 
      'zfcuser_user_mapper' => function ($sm) { 
       $options = $sm->get('zfcuser_module_options'); 
       $mapper = new Mapper\User(); 
       $mapper->setDbAdapter($sm->get('zfcuser_zend_db_adapter')); 
       $entityClass = $options->getUserEntityClass(); 
       $mapper->setEntityPrototype(new $entityClass); 
       $mapper->setHydrator(new Mapper\UserHydrator()); 
       return $mapper; 
      }, 
      // ... 

Czy istnieje sposób, aby sprawić, że ZfcUser użyje mojej niestandardowej klasy mapera użytkownika?

Odpowiedz

4

Miałem ten sam problem co ty, ale udało mi się wreszcie zalogować do mojej aplikacji. Postępowałem zgodnie z radami Roba i stworzył własną fabrykę usług w moim istniejącym module użytkownika. Niestety Bernhard jest również na miejscu. Powinieneś zagłębić się w kod źródłowy ZfcUser, aby go uruchomić. Projekt, nad którym teraz pracuję, ma serwer MSSQL i muszę powiedzieć, że ciężko było sobie z nim poradzić. Zakończyłem modyfikowanie tylko jednej funkcji w źródle ZfcUser, aby strona logowania działała.

Potrzebuję tylko funkcji logowania dla bieżącej aplikacji, ale nadchodzący projekt ma dużo więcej funkcji. Szukałem czegoś, co nie byłoby zbyt skomplikowane, aby szybko się połączyć, a jednocześnie oferować więcej opcji i możliwości na przyszłość.

Oto co zrobiłem teraz i czego się nauczyłem:

skopiowane foldery jednostki i Mapper z katalogu ZfcUser do mojego istniejącego b2bUser (mój moduł) folderu. Wszystko ... nawet folder Exception wewnątrz Mapper. To może nie być konieczne, ale nie byłem w nastroju, aby znaleźć zależności.

W pliku zfcuser.global.php moja aktywna konfiguracja wygląda następująco:

'user_entity_class' => 'b2bUser\Entity\User', 
'enable_registration' => false, 
'enable_username' => true, 
'auth_identity_fields' => array('username'), 
'login_redirect_route' => 'home', 
'enable_user_state' => false, 

zostawiłem resztę ustawień na domyślne. Usunąłem opcję e-mail z auth tożsamości, ponieważ nie będą używać adresów e-mail do logowania się do systemu. Numer user_entity_class to ten, który skopiowałem ...

Moduł.php (b2bUser) Skopiowane następujących do config Service Manager:

'zfcuser_user_mapper' => function ($sm) { 
    $mapper = new Mapper\User(); 
    $mapper->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter')); 
    $mapper->setEntityPrototype(new Entity\User()); 
    $mapper->setHydrator(new Mapper\UserHydrator()); 
    return $mapper; 
}, 

Po konfiguracja została wykonana, zmieniłem obszary nazw itd plików w Jednostce i Mapper odzwierciedlać ich nowego domu. Zmieniono Entity i Interface, aby odzwierciedlić moją własną strukturę danych. Zrobiłem to samo z plikami Mapper i upewniłem się, że nazwy zmiennych w pliku Hydrator są takie same jak moje nazwy kolumn bazy danych.

Opuściłem plik AbstractDbMapper, w którym był. Ale to jest plik, który trochę zmodyfikowałem.

Oto, jak wygląda moja. Sterownik SQLSRV był pełen kupy, narzekając cały czas na obiekt lub ciąg ...

protected function select(Select $select, $entityPrototype = null, HydratorInterface $hydrator = null) 
{ 
    $this->initialize(); 
    $selectString = $this->getSlaveSql()->getSqlStringForSqlObject($select); 
    $stmt = $this->getDbAdapter()->driver->createStatement($selectString); 
    $stmt->prepare(); 
    $res = $stmt->execute($stmt); 

    $resultSet = new HydratingResultSet($hydrator ?: $this->getHydrator(), 
      $entityPrototype ?: $this->getEntityPrototype()); 
    $resultSet->initialize($res); 
    return $resultSet; 
} 

I to jest to. Mam nadzieję, że pomoże to komuś zbudować i uruchomić przynajmniej własny system. Nie opuszczę tego w ten sposób, ale to była misja, aby to zadziałało.

+0

Wielkie dzięki! Szukałem tych samych informacji, a przy pomocy twojego postu udało mi się ponownie załadować klasy Entity i Mappera zfcUser do wykorzystania z moim DB i rozszerzoną funkcjonalnością Entity! – Brock

3

Ceate własne fabryki usługa dla zfcuser_user_mapper i będzie przyzwyczaić.

+1

Tak, to jest dokładnie to, czego szukam. Pytanie brzmi, jak to zrobić. –

+1

dodaj wpis dla zfcuser_user_mapper do swojego Module.php. upewnij się, że moduł zostanie załadowany po ZfcUser, spowoduje to nadpisanie wartości domyślnej. aby zobaczyć teraz konfigurację zfcuser_user_mapper, zobacz Module.php z ZfcUser. Jestem zaskoczony, że kwestia niestandardowego stołu trwała przez jakiś czas bez zmiany oficjalnej bazy kodów. możesz chcieć spojrzeć na mój widelec na https://github.com/thoaionline/ZfcUser – thoaionline