9

Właśnie przeczytałem samouczek Rob Aena z Roberta Allena (http://akrabat.com/wp-content/uploads/Getting-Started-with-Zend-Framework-2.pdf) o tym, jak wstrzykiwać zależności do twoich rzeczy, np. Wstrzykiwanie do adaptera tabeli do twoich klas stołowych.Zend Framework 2 - DI i konieczności wstrzykiwania adaptera tabeli do tabel ... nużące?

To wydaje się być jak mam to zrobić:

 array(
      'Application\Model\DbTable\UserTable', 
     ) => array(
      'parameters' => array(
       'config' => 'Zend\Db\Adapter\PdoMysql', 
      ) 
     ), 

     array(
      'Application\Model\DbTable\UserProfileTable', 
     ) => array(
      'parameters' => array(
       'config' => 'Zend\Db\Adapter\PdoMysql', 
      ) 
     ), 

Ok to całkiem fajne, ale mam około 84 stolików, więc będę musiał dodać każdy z nich i powiedzieć, że Chcę PdoMySQL wstrzykiwania do nich wszystkich. Czy jest jakiś właściwy sposób to zrobić, takie jak określenie mojego całego folderu DbTable? Nawet to nie działa:

 array(
      'Application\Model\DbTable\UserTable', 
      'Application\Model\DbTable\UserProfileTable' 
     ) => array(
      'parameters' => array(
       'config' => 'Zend\Db\Adapter\PdoMysql', 
      ) 
     ), 

Ktoś jeszcze to zrobił i znalazł lepsze rozwiązanie?

Dzięki, Dom

+0

Patrząc tylko na to, gdzie zdefiniowałeś tablice (i użyłeś tablic dla kluczy), odniosłem wrażenie, że klucze tablicy mogą być tylko ciągami lub liczbami całkowitymi w PHP. Czy ktoś może mnie poprawić, jeśli to jest złe? – bearver

+0

Ma sens: D Próbowałem spojrzeć na wstrzykiwanie adaptera DB bezpośrednio do AbstractTable, ale jest to klasa abstrakcyjna i to nie działa. Następnie próbowałem umieścić go w Zend \ Db \ Table \ Table, a następnie rozszerzyć to, ale znowu to nie działa ... Musi istnieć lepszy sposób obejścia tego niż określenie tego samego kodu 90 razy –

Odpowiedz

1

Twoje pytanie jest dobry, i zgadzam się, ten scenariusz, w którym zależność wtrysku nie ma sensu. Nie przeglądałem jeszcze interfejsu API ZF2, czy całkowicie porzuciły możliwość wiązania adaptera na poziomie połączenia, a nie na poziomie tabeli?

W mojej klasie bazy danych używam pliku yaml do przechowywania ustawień połączenia; nazwa użytkownika, hasło, adapter itd. Zrobiłem to w formacie, który można przekazać bezpośrednio do Zend_Config, który następnie można przekazać do klasy Zend_Db.

// Entry in connection.yml 
database: 
    adapter: Pdo_Mysql 
    params: 
    host:  myhost 
    dbname: mydatabase 
    username: myusername 
    password: mypassword 

// Parse yaml file to get above snippet in an array ($dbConnectionparams) 

$config = new Zend_Config($dbConnectionParams); 

$dbo = Zend_Db::factory($config->database); 

Teraz, jeśli kiedykolwiek trzeba zmienić adapter do połączenia z bazą danych tylko muszę zmienić go w jednym miejscu, w pliku connection.yml.

Sądzę, że można przechowywać dane tego rodzaju połączenia w różnych innych formatach (xml itp.).

+0

Myślę, że mogłem się potknąć po odpowiedzi! Wygląda na to, że EvanDotPro stworzył klasę "DiPdoMysql", która wygląda jak rozszerzenie PdoMysql dla przyjaznego Di. https://github.com/EvanDotPro/EdpUser DiPdoMysql jest w https://github.com/EvanDotPro/EdpCommon/tree/master/src/Zend/Db/Adapter –

+0

@DominicWatson: Interesujące, wydaje się, że ZF2 powinien supoort ten typ zachowania natywnie. –

+0

Tak, myślę, że pamiętam, że czytałem jego klasę DiPdoMysql, dopóki Zend \ DB nie zostało w pełni przepisane: D –