2012-02-21 20 views
6

Potrzebuję wymyślić najlepszą praktykę do efektywnego wykorzystania modeli w Zend Framework.Jak zoptymalizować modele w Zend Framework?

Obecnie mam zajęcia rozciągające Zend_Db_Table_Abstract które obsługują moje zapytania dla każdej klasy odpowiedniej tabeli.

Kiedy potrzebuję uzyskać dostęp do 5 powiedz tych tabel ze sterownika, znajduję się tworzenie 5 nowych wystąpień każdego konkretnego obiektu Zend_Db_Table. To naprawdę nieskuteczne.

Myślałem o realizacji wzór fabryki do tworzenia nowych instancji (lub dostarczyć kopię istniejącego statycznego), ale nie jestem pewien. Czy to najlepszy sposób, aby to osiągnąć?

Jaki jest prawidłowy sposób obsługi modeli zapewniających szybkość bez zużywania nadmiernych zasobów? Czy w grę powinien wchodzić leniwy załadunek?

[EDIT] Jako przykład mam klasy używam do obsługi coraz dane o lokalizacji z surowego zapytaniu i potrzebują tych obiektów w celu analizowania zapytanie:

// Initialize database object 
$this->dbLocations = new Model_Locations; 
$this->dbStates = new Model_States; 
$this->dbZipcodes = new Model_Zipcodes; 
$this->dbLookup = new Model_Lookup; 

W innej klasie może potrzebować ponownie uzyskać dostęp do tych modeli, więc powtarzam powyższy kod. Zasadniczo reinicjowanie obiektów, które mogą być statyczne/singleton.

+1

Twoje pytanie jest dość płace, czy możesz pokazać przykład kodu, w którym faktycznie tworzysz instancje 5 klas tabel i opisujesz, czego potrzebujesz. – markus

+0

Rozumiem twoje obawy, ale tak naprawdę nie podążam. Stwierdziłem, że tworzenie wielu wystąpień klasy, a szczególnie klasy abstrakcyjnej, jest rzeczą w OOP. Kwestionowanie tego modelu tabeli jest trochę podobne do kwestionowania do mnie OOP lub dziedziczenia. –

+0

Na poziomie podstawowym użycie w tej metodzie jest dopuszczalne. Mam niestandardowe "procedury obsługi", z braku lepszego słowa ", które pobiera obiekt zapytania, analizuje właściwości w nim i przekazuje je do modułu obsługi położenia, który pobiera wszystkie dane o położeniu dla tego zapytania, a następnie przekazuje je do Przypadek obsługi danych, a także handler danych pogodowych.W wielu fazach, muszę uzyskać dostęp do różnych tabel i skończyć inicjowanie tych obiektów z różnych klas. Zobacz więcej informacji: http://stackoverflow.com/questions/9116838/data-enapsulation-and-data-flow-in-php –

Odpowiedz

3

staram się pracować w DbTable tak jak ty.Odkryłem, że jest to skuteczne, gdy potrzebuję wykonać kwerendę dla wielu tabel w jednej akcji, aby utworzyć kolejną warstwę modelu nad tabelą dbTable. Podobne do usługi lub warstwy domeny. W ten sposób muszę tylko zadzwonić do jednego modelu, ale wciąż mam funkcjonalność, której potrzebuję.

Oto prosty przykład, który może ostatecznie współdziałać z 5 klas DbTable i najprawdopodobniej kilka klas Row także:

<?php 

class Application_Model_TrackInfo 
{ 


    protected $_track; 
    protected $_bidLocation; 
    protected $_weekend; 
    protected $_shift; 
    protected $_station; 

    public function __construct() { 
     //assign DbTable models to properties for convience 
     $this->_track = new Application_Model_DbTable_Track(); 

    } 

    /** 
    * 
    * @param type $trackId 
    * @return type object 
    */ 
    public function getByTrackId($trackId) { 

     $trackData = $this->_track->fetchRow($trackId); 
     //getAllInfo() Application_Model_Row_TRack 
     $result = $trackData->getAllInfo(); 
     //returns std object reflecting data from 3 DbTable classes 
     return $result; 
    } 

    /** 
    *Get Station from trackid through bidlocationid 
    * 
    * @param type $trackId 
    * @return type object 
    */ 
    public function getStation($trackId){ 

     $data = $this->_track->fetchRow($trackId); 
     //This a Application_Model_Row_Track method 
     $result= $data->getStationFromBidLocation(); 

     return $result; 
    } 

} 

Mam nadzieję, że to pomaga.

[EDIT] Ponieważ pisałem tę odpowiedź poznałem zalety model domeny i dane odwzorowujące. Wow, co za różnica w mojej aplikacji. Nie magiczna kula, ale ogromna poprawa.
Dzięki
Alejandro Gervasio na co PHPMaster.com
Rob Allen w Akrabat.com
i
PADRAIC Brady w Surviving The Deepend

za ich pomoc w zrozumieniu tego wzorca.

+0

Za każdym razem, gdy używasz klasy Application_Model_TrackInfo, robi to, z czym mam problem. Tworzy obiekt (i) dbTable, który może, ale nie musi być użyty, następnie zostaje usunięty, a jego ponowne użycie tworzy to na nowo.Czy te połączenia dbTable powinny być generowane w paradygmacie fabrycznym, czy też w wielu równoległych instancjach dopuszczalne są dodatkowe koszty, którymi należy się zająć? –

+0

@cillosis Wygląda na to, że lepiej przyjrzeć się strategiom buforowania, aby zminimalizować zapytania Db. Możliwe jest również zastosowanie rozwiązania ORM (z pewną trwałością danych). – RockyFord

1

Wydajesz się być w possition gdzie wymagają sprawnego zarządzania danymi z funkcjami, że obecne ramy Zend nie pochodzi z. Zend nie ma wbudowanego mechanizmu do pracy z dowolnymi bazami danych, ma po prostu klasy otoki, które pomagają pisać twoje zapytania.

Co trzeba to obiekt model relacyjny (ORM), która jest must-have w profesjonalnej ramy. Jak rozumiem, ORM jest strukturą samą w sobie, ma wzorce i silnie zdefiniowane sposoby "robienia rzeczy", wspiera leniwy ładunek (w pełni wykorzystuje to) i optymalizuje w pełni twoje zapytania. Kiedy używasz ORM, nie piszesz nawet SQL, zamiast tego musisz zmienić swoją interpretację przechowywania danych, musisz zapomnieć o tabelach i skupić się na obiektach. W Doctrine na przykład każdy typ (tabela) jest określony przez klasę i każdy rekord (wiersz) jako instancja klasy, w której masz dostęp do różnych metod i właściwości. Obsługuje detektory zdarzeń i szalone relacje kaskadowe.

Nie trzeba już wyodrębniać wierszy z pokrewnych tabel podczas usuwania rekordów (jest to automatyczne), nie trzeba już pisać skomplikowanych i chaotycznych skryptów, aby zapewnić synchronizację systemu plików, można migrować do prawie dowolnego silnika baz danych w dowolnym momencie (mysql , postgresql, simplesql ..) i więcej ..

Używam Doctrine 2 w połączeniu z frameworkem Symfony 2 i muszę powiedzieć, że nie wrócę do Zend po nic. Tak, jest to skomplikowane i ciężkie, ale naprawdę najlepsze rozwiązanie. Kiedy dojdziesz do momentu, w którym będziesz musiał zarządzać setkami stołów z milionami rekordów - zobaczysz różnicę.

Więc, ostatnie podsumowanie: ORM to, czego potrzebujesz, istnieje wiele rozwiązań, wiem o dwóch naprawdę dobrych: Doctrine 1 lub 2 i Propel.

PS: ORM jest niezależna część systemu, tak naprawdę nie trzeba używać specjalnych ram, Zend może być skonfigurowany do pracy z doktryną cudownie :)

+4

Zend_Db IS sam w sobie jest implementacją schematu ORM Twoja odpowiedź nie rozwiązuje prawdziwego problemu z OP, tylko nakazuje mu zmienić narzędzie w oparciu o twoją osobistą oppion. Twój pierwszy akapit jest całkowicie błędny, co sugeruje, że mówisz abo rzeczy, których w rzeczywistości nie znasz. – markus

+0

Tak, a twoja całkowicie rozwiązuje problem .. –

+0

Nie napisałem żadnego, ponieważ na chwilę obecną brakuje w nim wystarczających informacji, aby napisać na nie odpowiedź. – markus