Migracja z Zend Framework w wersji 0.2.0 do 0.6.0


Jeśli chcemy aby aplikacja korzystająca z podstawowych bibliotek Zend Framework w wersji 0.2.0 działała po aktualizacji frameworka do wersji 0.6.0 musimy wprowadzić kilka zmian. Wprawdzie w dokumentacji został opisany sposób migracji, ale tylko dla komponentów kontrolera. Poniżej kilka porad.

  1. Zmiana sposobu ustawienia ścieżki bazowej
  2. Dodanie drugiego parametru w wywołaniach konstruktora Zend_Filter_Input
  3. Zamiana konstruktorów __construct() w klasach kontrolerów na metody init()
  4. Zastąpienie klasy Zend_View własną rozszerzoną klasą
  5. Włączenie wyrzucania wyjątków przez kontroler frontowy
  6. Dodanie echo przy wywołaniach metod $this->render() w plikach widoków
  7. Usunięcie ścieżki bazowej z pierwszego parametru metod _redirect() w kontrolerach
  8. Dodanie plugina notfound aby emulować działanie metody noRoute
  9. Zmiana API w klasie Zend_Http_Client

1. Zmiana sposobu ustawienia ścieżki bazowej

Zmieniamy sposób ustawienia ścieżki bazowej. Wcześniej robiliśmy do w routerze, teraz robimy to w kontrolerze frontowym. Czyli zamiast:

PHP:
  1. <?php
  2. $router->setRewriteBase($appPath);
  3. ?>

robimy tak:

PHP:
  1. <?php
  2. $frontcontroller->setBaseUrl($appPath);
  3. ?>

2. Dodanie drugiego parametru w wywołaniach konstruktora Zend_Filter_Input

Jeśli w pliku ładującym tworzymy obiekt filtrujący dane wejściowe, musimy się upewnić, że po zaimportowaniu tablica nie zostanie wyczyszczona. Zrobimy to dodając drugi parametr w konstruktorze, czyli zamiast:

PHP:
  1. <?php
  2. $get = new Zend_Filter_Input($_GET);
  3. ?>

powinniśmy mieć:

PHP:
  1. <?php
  2. $get = new Zend_Filter_Input($_GET, false);
  3. ?>

3. Zamiana konstruktorów __construct() w klasach kontrolerów na metody init()

Jeśli w klasach kontrolerów używamy konstruktorów, powinniśmy zamienić je na metody init(). Czyli zamist:

PHP:
  1. <?php
  2. class ArticleController extends Zend_Controller_Action
  3. {
  4.     public function __construct()
  5.     {
  6.         // [...]
  7.     }
  8.     // [...]
  9. }
  10. ?>

powinniśmy mieć:

PHP:
  1. <?php
  2. class ArticleController extends Zend_Controller_Action
  3. {
  4.     public function init()
  5.     {
  6.         // [...]
  7.     }
  8.     // [...]
  9. }
  10. ?>

4. Zastąpienie klasy Zend_View własną rozszerzoną klasą

Jeśli chcemy uniknąć błędów informujących o niezdefiniowanej zmiennej, powinniśmy utworzyć własną klasę widoku rozszerzając klasę Zend_View_Abstract, nadpisując w niej metodę offsetGet() obiektu ArrayObject. Nasza nowa klasa powinna wyglądać tak:

PHP:
  1. <?php
  2.  
  3. class Foo_View extends Zend_View_Abstract
  4. {
  5.  
  6.     protected function _run()
  7.     {
  8.         include func_get_arg(0);
  9.     }
  10.    
  11.     public function offsetGet($index)
  12.     {
  13.         if (! $this->offsetExists($index)) {
  14.             return null;
  15.         }
  16.         return parent::offsetGet($index);
  17.     }
  18.  
  19. }
  20. ?>

Oczywiście w miejscu, w którym tworzymy instancję klasy Zend_View, powinniśmy tworzyć instancję naszej własnej rozszerzonej klasy.

5. Włączenie wyrzucania wyjątków przez kontroler frontowy

Jeśli chcemy by kontroler frontowy wciaż wyrzucał wyjątki, powinniśmy włączyć tą opcję w kontrolerze frontowym, zaraz przed jego uruchomieniem:

PHP:
  1. <?php
  2. $controller->throwExceptions(true);
  3. ?>

6. Dodanie echo przy wywołaniach metod $this->render() w plikach widoków

W plikach widoków przy załączaniu plików szablonów powinniśmy dodać echo przed wywołaniem metod. Czyli zamiast:

PHP:
  1. <?php
  2. $this->render('foo.tpl');
  3. ?>

powinniśmy zrobić to tak:

PHP:
  1. <?php
  2. echo $this->render('foo.tpl');
  3. ?>

7. Usunięcie ścieżki bazowej z pierwszego parametru metod _redirect() w kontrolerach

Jeśli w kontrolerach używamy metod _redirect() podając w adresach przekierowania bazowy adres aplikacji, powinniśmy go usunąć, ponieważ w nowej wersji domyślnie jest on dodawany automatycznie. Jeśli przekierowanie tworzyliśmy w ten sposób:

PHP:
  1. <?php
  2. $this->_redirect('/admin/article/index/');
  3. ?>

To teraz powinniśmy to zrobić tak:

PHP:
  1. <?php
  2. $this->_redirect('article/index/');
  3. ?>

Bazowy adres, czyli ten pod którym znajduje się plik ładujący (w tym przypadku "/admin/") zostanie teraz automatycznie dodany na początku adresu przekierowania.

8. Dodanie plugina notfound aby emulować działanie metody noRoute

Jeśli chcemy, aby metoda noRoute wciaż działała w wersji 0.6.0 powinniśmy w kontrolerze zarejestrować plugin:

PHP:
  1. <?php
  2.  
  3. class Foo_Controller_Plugin_Notfound extends Zend_Controller_Plugin_Abstract
  4. {
  5.  
  6.     public function preDispatch($request)
  7.     {
  8.         $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
  9.  
  10.         if (!$dispatcher->isDispatchable($request))
  11.         {
  12.             $request->setControllerName($dispatcher->getDefaultController())
  13.             ->setActionName('noroute')
  14.             ->setDispatched(false);
  15.         }
  16.     }
  17.  
  18. }
  19. ?>

9. Zmiana API w klasie Zend_Http_Client

W konstruktorze klasy Zend_Http_Client podajemy teraz adres:

PHP:
  1. <?php
  2. $http = new Zend_Http_Client('http://example.org/');
  3. ?>

Następnie dodajemy nagłówki:

PHP:
  1. <?php
  2. $headers = array(
  3. 'Accept' => 'text/html',
  4. 'Referer' => 'http://cms.naruniec.info',
  5. 'User-Agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
  6. );
  7. $http->setHeaders($headers);
  8. ?>

a na koniec odbieramy odpowiedź GET:

PHP:
  1. <?php
  2. $httpResponse = $http->request();
  3. ?>

Wcześniej nagłówki mogliśmy podać w konstruktorze, a odpowiedź odbieraliśmy za pomocą metody $http->get().

Te porady powinny w większości przypadków pomóc w migracji do wersji 0.6.0. Więcej szczegółów na temat migracji dla klas kontrolera można znaleźć w dokumentacji w rozdziale na temat migracji z wersji 0.2.0 lub z poprzednich do 0.6.0

Informacje oraz linki


Inne artykuły
Zend Framework 0.7.0
Zend Framework już na półmetku
Polecane
Zend Studio - The premiere PHP IDE

Dodaj komentarz

Poświęć chwilę i wyraź swoją opinię. Możesz użyć niektórych znaczników HTML.

Komentarze czytelników

No, ładniutkie, ale co do drugiego punktu, to już chyba było w dwójce.

bardzo pomocne. zwłaszcza 8 bardzo mi pomogła, dzięki temu wreszcie wiem jak obsłużyć żądanie gdy kontroler nie istnieje. mam nadzieję, że niedługo pojawi się jeszcze coś ciekawego na temat ZF.