2012-05-15 10 views
5

Podczas próby przestrzegania ustalonych najlepszych praktyk, takich jak unikanie pojedynczych znaków, rejestru, właściwości statycznych i podstawowych kontrolerów, w jaki sposób mogę wypełnić mój układ (i częściowe elementy używane przez układ) danymi, które są używane tylko przez układ i często we wszystkich działaniach ?Jak zapełnić zmienne Zend_Layout danymi backendu?

Typowy scenariusz to menu zbudowane na zmiennych danych, takich jak baza danych. Mając na uwadze rozdzielenie obaw, widoki/układ nigdy nie powinny bezpośrednio rozmawiać z backendem, ale raczej powiedziano, co należy zawrzeć.

Używanie wtyczki kontrolera frontowego jest po prostu niemożliwe bez użycia pojedynczej "funkcji" w Zend_Layout. Wtyczka zna tylko obiekt żądania i odpowiedzi, nie ma dostępu do kontrolerów, widoków ani układu.

Pomocnicy akcji Zenda mają metody init/preDispatch/postDispatch. Do HelperBroker można dodać pomocników akcji (np. Za pomocą bootstrap), które będą wykonywane w normalnym przepływie aplikacji.

Użycie metody init do wprowadzania danych do widoku nie jest możliwe, ponieważ jest wyzwalane, zanim kontroler/widok będzie gotowy. preDispatch/postDispatch jest możliwy, ale nie idealny, ponieważ metody te są zawsze wywoływane podczas wykonywania akcji kontrolera.

Oznacza to, że wszystkie zastosowania Zend_Controller_Action :: _ forward() będą również wykonywać preDispatch/postDispatch we wszystkich pomocnikach akcji. Nie ma to dużego wpływu na kod, z wyjątkiem prędkości, naprawdę nie chcę ustawiać zmiennej widoku (lub pomocnika widoku) kilka razy. Można kodować wokół tego problemu za pomocą jakiejś zmiennej $ firstRun, ale naprawdę nie chcę tego śledzić we własnym kodzie.

Inna metoda robi to w bootstrapie, ale moim zdaniem to naprawdę nie pasuje do tego.

W jaki sposób mogę wypełnić mój układ/widok pomocnika danymi z bazy danych, robiąc to tylko raz i nadal zachowując dobry rozdział obaw?

Odpowiedz

0

Podążyłem za podejściem ActionHelper, ustawiając zmienne widoku w metodzie preDispatch. To było najbardziej logiczne miejsce, według mnie. Ponadto moje projekty nie używały Zend_Controller_Action::_forward(), więc nie miałem żadnych obaw o prędkość w związku z wielokrotnym uruchomieniem helpera.

nadzieję, że pomoże,

0

Można iść z Pomocników działania, jak określono w niniejszym answer (spójrz na pytanie też jego dość dużo podobne do Ciebie)

0

użyję pomocników działania zbyt . Wystarczy wypełnić zmienne widoku i wyświetlić je za pomocą zwykłego PHP/partials/render/viewHelper (w zależności od złożoności).

Twój problem z wielu tras z wykorzystaniem preDispatch można rozwiązać za pomocą

if (!($this->view->myVar)) { // or array_key_exist or isset - depending on your use case 
    $this->view->myVar = $someModel->getSomeData(); 
} 

Który jest dobrze IMO.

Powiązane problemy