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
$router->setRewriteBase($appPath);
?>

robimy tak:

<?php
$frontcontroller->setBaseUrl($appPath);
?>

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
$get = new Zend_Filter_Input($_GET);
?>

powinniśmy mieć:

<?php
$get = new Zend_Filter_Input($_GET, false);
?>

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
class ArticleController extends Zend_Controller_Action
{
    public function __construct()
    {
        // [...]
    }
    // [...]
}
?>

powinniśmy mieć:

<?php
class ArticleController extends Zend_Controller_Action
{
    public function init()
    {
        // [...]
    }
    // [...]
}
?>

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

class Foo_View extends Zend_View_Abstract
{

    protected function _run()
    {
        include func_get_arg(0);
    }

    public function offsetGet($index)
    {
	    if (! $this->offsetExists($index)) {
		    return null;
	    }
	    return parent::offsetGet($index);
    }

}
?>

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
$controller->throwExceptions(true);
?>

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
$this->render('foo.tpl');
?>

powinniśmy zrobić to tak:

<?php
echo $this->render('foo.tpl');
?>

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
$this->_redirect('/admin/article/index/');
?>

To teraz powinniśmy to zrobić tak:

<?php
$this->_redirect('article/index/');
?>

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

class Foo_Controller_Plugin_Notfound extends Zend_Controller_Plugin_Abstract
{

    public function preDispatch($request)
    {
        $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();

        if (!$dispatcher->isDispatchable($request))
        {
            $request->setControllerName($dispatcher->getDefaultController())
            ->setActionName('noroute')
            ->setDispatched(false);
        }
    }

}
?>

9. Zmiana API w klasie Zend_Http_Client

W konstruktorze klasy Zend_Http_Client podajemy teraz adres:

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

Następnie dodajemy nagłówki:

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

a na koniec odbieramy odpowiedź GET:

<?php
$httpResponse = $http->request();
?>

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


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.