2012-11-01 11 views
6

Ho aggiunto il modulo ZfcUser alla mia applicazione Zend Framework 2. Ma devo usare la tabella di database esistente, , che ha nomi di colonne leggermente differenti rispetto alla struttura di tabella predefinita per ZfcUser.ZF2: mappatore utente personalizzato per modulo ZfcUser

In ZfcUser wiki page si dice che è possibile utilizzare il mapper personalizzato se il mio modello non è conforme all'interfaccia fornita. E poiché la tabella del mio database è diversa da quella predefinita, la mia classe di entità utente è diversa da ZfcUser \ Entity \ User standard. Ma posso dire ZfcUser a lavorare con la mia classe facilmente sovrascrivendo l'impostazione nel file di config/autoload/zfcuser.global.php:

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

Ma Creare un account non trovato un modo semplice per dire ZfcUser a usa la mia classe di mapper finora.

ho trovato solo che il mapper è stato creato da ZfcUser \ Modulo :: getServiceConfig() all'interno del quale, posso vedere il mapper viene restituito alla sua funzione di fabbrica:

// ... 
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; 
      }, 
      // ... 

C'è un modo per fare in modo che ZfcUser usi la mia classe utente personalizzata di mappatura?

risposta

4

Ho avuto lo stesso problema come te, ma sono riuscito ad accedere alla mia applicazione alla fine. Ho seguito il consiglio di Rob e creato la mia fabbrica di servizi all'interno del mio modulo utente esistente. Sfortunatamente anche Bernhard è perfetto. Devi per forza scavare nel codice sorgente di ZfcUser per farlo funzionare. Il progetto su cui sto lavorando ora ha un server MSSQL e devo dire che è stato difficile gestire le cose. Ho finito col tweaking solo una funzione nel sorgente ZfcUser per far funzionare la pagina di login.

Mi serve solo la funzionalità di accesso per l'applicazione corrente, ma il prossimo progetto è molto più orientato ai ruoli. Stavo cercando qualcosa che non sarebbe troppo complicato per collegarmi rapidamente e, allo stesso tempo, offrire più opzioni e possibilità per il futuro.

Ecco quello che ho fatto per ora e quello che ho imparato:

ho copiato le cartelle di entità e Mapper dalla directory ZfcUser al mio b2bUser esistente cartella (il mio modulo). Tutto ... anche la cartella Exception all'interno di Mapper. Potrebbe non essere necessario, ma non ero dell'umore adatto per capire le dipendenze.

Nel file zfcuser.global.php, la mia configurazione attiva si presenta come segue:

'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, 

ho lasciato il resto le impostazioni di default. Ho rimosso l'opzione email dalle identità di autenticazione perché non useranno gli indirizzi email per accedere al sistema. Il user_entity_class è quello che ho copiato su ...

Modulo.php (b2bUser) Copiato il seguente al servizio responsabile di configurazione:

'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; 
}, 

Dopo la messa a punto è stato fatto, ho cambiato gli spazi dei nomi, ecc dei file in Entity e Mapper in modo da riflettere la loro nuova casa. Modificata entità e interfaccia per riflettere la mia struttura dati. Ho fatto lo stesso con i file Mapper e mi sono assicurato che i nomi delle variabili nel file Hydrator corrispondessero ai nomi delle colonne del mio database.

Ho lasciato il file AbstractDbMapper dov'era. Ma questo è il file che ho ritoccato un po '.

Ecco com'è il mio. Il driver SQLSRV era pieno di pooh, lamentandosi tutto il tempo di un oggetto o di una stringa ...

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; 
} 

E questo è quello. Spero che aiuti qualcuno a farlo funzionare almeno sul proprio sistema. Non lascerò il mio in questo modo, ma è stato un po 'una missione per farlo funzionare.

+0

Grazie mille! Stavo cercando le stesse informazioni e con l'aiuto del tuo post sono riuscito a ricaricare le classi Entity e Mapper di zfcUser da utilizzare con il mio DB e le funzionalità estese di Entity! – Brock

0

Attualmente non sembra esserci un modo semplice per modificare la struttura della tabella senza modificare la sorgente ZfcUser. C'è una richiesta di pull su Github che dovrebbe risolvere questo problema:

https://github.com/ZF-Commons/ZfcUser/pull/174

3

ceate la propria fabbrica di servizio per zfcuser_user_mapper e si abitua.

+1

Sì, sarebbe esattamente quello che sto cercando. La domanda è come farlo. –

+1

aggiungi una voce per zfcuser_user_mapper nel tuo Module.php. assicurati che il tuo modulo sia caricato dopo ZfcUser, sovrascriverà quello predefinito. per vedere ora è configurato zfcuser_user_mapper, vedere Module.php di ZfcUser. Sono sorpreso che il problema del tavolo personalizzato sia rimasto là fuori per un po 'senza cambiare la base di codice ufficiale. potresti voler dare un'occhiata alla mia biforcazione all'indirizzo https://github.com/thoaionline/ZfcUser – thoaionline