Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Optymalizacja
Forum PHP.pl > Forum > PHP > Frameworki
mate
Witam, mam pytanie związane ze zwiększeniem optymalizacji mojego kodu. Mam zrobione klasy abstrakcyjne i większość zawsze jest dziedziczona w moich akcjach, jednak od czasu do czasu zdarza się, że mam jakieś akcje w kontrolerach, które muszą się różnić od podstawowej i wtedy przeciążam całą akcję, a w 90% i tak powielam kod by zmienić tylko 2 linie. Dlatego chciałem zapytać co jest dobre na zastosowanie tego aby ciągle nie powielać kodu ?
Chodzi mi np. o takie coś:

  1. $this->_helper->layout()->disableLayout();
  2. $this->_helper->viewRenderer->setNoRender(true);
  3. if(!$this->getRequest()->isXmlHttpRequest()) return;
  4.  
  5. if ($this->getRequest()->isPost()) {
  6. $form = new Default_Form_ContactForm();
  7. if ($form->isValid($this->getRequest()->getPost())) {
  8. ------------------------------------------------------------------
  9. TU JAKIEŚ ZADANIA, KTÓRE SĄ UNIKALNE DLA AKCJI
  10. ------------------------------------------------------------------
  11. }
  12. $this->view->form = $form;
  13. } else {
  14. throw new Exception('Błędny adres!', 404);
  15. }


Jak widać wszystkie te linie mogą być spokojnie raz zaimplementowane, a nie powtarzane tylko dlatego, że coś się różni w tym bloku.
Pozdrawiam
CuteOne
  1. public function viewAction() {
  2.  
  3. $params = $this->getAllParams();
  4.  
  5. $this->_helper->layout()->disableLayout();
  6. $this->_helper->viewRenderer->setNoRender(true);
  7. if(!$this->getRequest()->isXmlHttpRequest()) return;
  8.  
  9. if ($this->getRequest()->isPost()) {
  10. $form = new Default_Form_ContactForm();
  11. if ($form->isValid($this->getRequest()->getPost())) {
  12.  
  13. $method = $params['unikalny_parametr_dla_akcji'].'Forward';
  14.  
  15. if(method_exists($this, $method)) {
  16. $this->$method($form);
  17. }
  18. else { throw new Zend_Exception(); }
  19. }
  20. $this->view->form = $form;
  21. } else {
  22. throw new Exception('Błędny adres!', 404);
  23. }
  24. }
  25.  
  26. public function ahaForward($form) { }
  27.  
  28. public function eheForward($form) { }


lub wykorzystaj wbudowany _forward()
irmidjusz
rozwiązanie tego jest banalnie proste, poszukaj info o wzorcu projektowym template method, po polsku methoda szablonowa
karolrynio
Osobiście użyłbym: Zend_EventManager (dodany chyba w wersji 1.12)
Może robic dokładnie to o czym piszesz.
W Zendzie 2 przykładowy kod wyglądałby tak:
  1. $this->_helper->layout()->disableLayout();
  2. $this->_helper->viewRenderer->setNoRender(true);
  3. if(!$this->getRequest()->isXmlHttpRequest()) return;
  4.  
  5. if ($this->getRequest()->isPost()) {
  6. $form = new Default_Form_ContactForm();
  7. if ($form->isValid($this->getRequest()->getPost())) {
  8. $eventManager->trigger('nazwaZdarzenia', $this, array( /* parametry */ ))
  9. }
  10. $this->view->form = $form;
  11. } else {
  12. throw new Exception('Błędny adres!', 404);
  13. }


Teraz jeśli chcesz dla jakiegoś kontrolera zmienić zachowanie możesz zrobic tak:

  1. $events->attach('TwojController', 'nazwaZdarzenia', function($e) {
  2. $controller = $e->getTarget();
  3. // zrób coś z czego potrzebujesz, np:
  4. $controller->jakasMetoda();
  5. });


Możesz to zrobic w pluginie, bootstrapie gdzie chcesz. Moim zdaniem to jest najlepszy sposób bo możesz nie zmieniając kodu podpinac się w dowolnym miejscu metody.
mate
Ciekawe rozwiązanie, dzięki za odopowiedź, na pewno o tym poczytam. Dzięki.
Lysiur
popieram ciekawie wyglądająca i nieznana przeze mnie opcja smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.