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.
- Zmiana sposobu ustawienia ścieżki bazowej
- Dodanie drugiego parametru w wywołaniach konstruktora Zend_Filter_Input
- Zamiana konstruktorów __construct() w klasach kontrolerów na metody init()
- Zastąpienie klasy Zend_View własną rozszerzoną klasą
- Włączenie wyrzucania wyjątków przez kontroler frontowy
- Dodanie echo przy wywołaniach metod $this->render() w plikach widoków
- Usunięcie ścieżki bazowej z pierwszego parametru metod _redirect() w kontrolerach
- Dodanie plugina notfound aby emulować działanie metody noRoute
- 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()
-
{
-
}
-
-
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
-
?>
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
-
'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



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