2012-10-23 13 views
7

Esiste un modo migliore per associare dati da una classe entità ODM doctrine2 a un modulo Zend2 oltre a utilizzare bind()?Binding dati modulo Zend2 da doctrine2 ODM

Se sì, quale sarebbe? Vorrei semplicemente recuperare i dati come una matrice e passare ogni singolo campo? Sono alle prese con questo e molto probabilmente renderlo più difficile di quanto dovrebbe essere.

Quando chiamo la funzione bind(), emette un errore Zend che fa riferimento all'idratazione di default. Devo fare qualcosa di speciale nella mia classe di entità?

Edit: Qui sono gli errori esatte Zend sta gettando

~ \ vendor \ ZendFramework \ ZendFramework \ Libreria \ Zend \ stdlib \ Hydrator \ ArraySerializable.php: 35

Zend \ stdlib \ Hydrator \ ArraySerializable :: estratto si aspetta che il previsto oggetto implementare getArrayCopy()

mi fanno pensare che ho bisogno di uno:

  1. uso Zends Idratatori (che io sarei per la ricerca come implementare) o
  2. Idratatori
  3. utilizzo di Doctrine2 (che, avrei dovuto anche per capire il modo migliore per attuare)
+0

Modifica la domanda per contenere il messaggio di errore effettivo. Il modo in cui ZF2 lavora ti lega un oggetto/entità al modulo e quindi l'Idratore assegnato si assicura che i campi modulo referenziati siano mappati in modo appropriato. Questo in realtà è un caso d'uso molto semplice e una buona separazione delle preoccupazioni, dato dai messaggi di errore che saprai sempre dove cercare. – Sam

risposta

14

Per Zend \ Modulo di essere in grado di idratare la vostra entità è necessario avere qualcosa di simile nella classe entità:

public function getArrayCopy() 
{ 
    return get_object_vars($this); 
} 
+1

magia idratazione automatica, stile ZF2. Facile curva di apprendimento ... –

+1

È stato incuriosito dalla funzione get_object_vars. Riferimento: [get_object_vars] (http://php.net/manual/en/function.get-object-vars.php) - "Ottiene le proprietà non statiche accessibili dell'oggetto specificato in base all'ambito." –

+1

Per maggiore chiarezza, si aggiunge metodo di cui sopra a questo file: '\ ZF2 dimostrativi \ module \ Album \ src \ Album \ modello \ Album.php'. –

1

I usa il metodo populate nella mia classe di entità. qualcosa di simile

public function populate($data = array()) 
    { 
     $this->id = (isset($data['id'])) ? $data['id'] : null; 
     $this->username = (isset($data['username'])) ? $data['username'] : null; 
     $this->pass = (isset($data['pass'])) ? $data['pass'] : null;    

    } 

e poi controller è possibile utilizzare la funzione compilare qualcosa di simile.

$user = new User(); 
$request = $this->getRequest(); 
$user->populate($request->getPost()); 

Non sono sicuro se ho capito bene il tuo quesiton.

+0

Fondamentalmente, le mie domande riguardano un editAction(). Voglio che gli utenti siano in grado di modificare le informazioni che hanno già pubblicato, ovviamente. Ho svolto alcune ricerche e ho scoperto che Zend utilizza un metodo bind() che estrarrà i dati dalla mia entità e popolerà il modulo da modificare. Attualmente sto facendo qualcosa come $ form = new Form(); $ Form-> bind ($ entità). La mia $ entity usa getServiceLocator() di doctrne2 e costruisco una query usando getQueryBuilder(). Se navigando al mio editAction ricevo il seguente errore Zend \ stdlib \ Hydrator \ ArraySerializable :: estratto si aspetta che l'oggetto fornito di implementare getArrayCopy() – bl4design

1

Fortunatamente, non avete bisogno di qualcosa di più nei tuoi entità se seguite questo tutorial:

http://samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/ io uso quasi lo stesso approccio ed è (quasi) funziona bene. Due cose a cui dovresti preoccuparti:

1.) Assicurarsi di convalidare tutti i dati presenti nelle tabelle (o almeno quelli non nulli), perché solo i campi convalidati vengono inviati al DB. Mi è stato detto dall'autore di questo blog. :)

2.) Quando si crea la vista per il modulo di modifica, aggiungere l'ID per il percorso:

$form->setAttribute('action', $this->url('post', 
        array('action'=>'add', 'id'=>"$this->id")))->prepare(); 

Buona fortuna!

2

in te .../Modello/XXXXTable.php
definire una funzione vogliono per ottenere un record.

$id = (int)$id; 
    $row = $this->tableGateway->select(array('id'=>$id)); 
    $row = $row->current(); //this line is very important 
+0

grazie, ho davvero risparmiato le mie ore. –

2

Io uso il seguente codice a module.config.php utilizzare dottrina idratante

$form = new ...; 
$dm = $sm->get('doctrine.documentmanager.odm_default'); 
$form->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($dm)); 
return $form;