Migracja z Zend Framework w wersji 0.8.0 do 1.0.0 RC1
Wczoraj przeprowadziłem migrację biblioteki Zend Framework z wersji 0.8.0 do 1.0.0RC1 w mojej aplikacji. Zamieszczam spis najważniejszych zadań jakie trzeba było wykonać, myślę, że może to trochę ułatwić przejście przez proces migracji.
- Ładowanie plików oraz klas
- Korzystanie z rejestru
- Informacje o wersji
- Nazwy tabel w modelach
- Aliasy dla tabel w zapytaniach
- Wyświetlanie informacji o zmiennych
- Metoda
find()w modelach - Przekierowania
- Filtrowanie danych przychodzących
- Klasa ViewRenderer
1. Ładowanie plików oraz klas
W związku z rezygnacją z głównej klasy Zend metody służące do ładowania plików oraz klas zostały przeniesione do komponentu Zend_Loader. Trzeba zmienić wywołania ładujące moduł:
-
<?php
-
require_once('Zend.php');
-
// zmienić na
-
require_once('Zend/Loader.php');
-
?>
Zamienić wywołania metody ładującej plik:
-
<?php
-
Zend::loadFile();
-
// zmienić na
-
Zend_Loader::loadFile();
-
?>
Zmienić wywołania metody ładującej klasę:
-
<?php
-
Zend::loadClass();
-
// zmienić na
-
Zend_Loader::loadClass();
-
?>
2. Korzystanie z rejestru
Funkcjonalność rejestru także została przeniesiona do osobnego modułu. Trzeba zmienić wywołania metody dodającej zmienną do rejestru:
-
<?php
-
Zend::register('foo', $foo);
-
// zmienić na
-
Zend_Registry::set('foo', $foo);
-
?>
a także zmienić wywołania metody odbierającej zmienną:
-
<?php
-
Zend::registry('foo');
-
// zmienić na
-
Zend_Registry::get('foo');
-
?>
3. Informacje o wersji
Stała przechowująca informacje o wersji została przeniesiona z klasy Zend do osobnego komponentu. Trzeba zmienić odwołania do tej stałej:
-
<?php
-
Zend::VERSION;
-
// zmienić na
-
Zend_Version::VERSION;
-
?>
4. Nazwy tabel w modelach
Obecnie nazwy klas modeli, czyli klas rozszerzających Zend_Db_Table, nie są już konwertowane z postaci NazwaKlasy na nazwa_tabeli, więc trzeba o to zadbać samemu. Można to zrobić ustawiając w każdym modelu na sztywno nazwę tabeli, za którą model jest odpowiedzialny:
-
<?php
-
class FooBar
-
{
-
protected $_name = 'foo_bar';
-
}
-
?>
Jeśli nie ustawimy nazwy tabeli, to jako nazwa tabeli zostanie bezpośrednio użyta nazwa klasy. Ustawienie nazwy tabeli można zrobić też automatycznie dla wszystkich tabel za pomocą klasy transformującej nazwę klasy na nazwę tabeli
5. Aliasy dla tabel w zapytaniach
Jeśli używamy klasy Zend_Db_Select do tworzenia zapytań i w tych zapytaniach stosujemy aliasy dla tabel to trzeba zmienić sposób ich definiowania. Wystarczy zamienić klucz tablicy z jej wartością, czyli:
6. Wyświetlanie informacji o zmiennych
Metoda wyświetlająca informacje o zmiennej została przeniesiona z klasy Zend do komponentu Zend_Debug. W związku z tym należy:
-
<?php
-
Zend::dump($foo);
-
// zmienić na
-
Zend_Debug::dump($foo);
-
?>
7. Metoda find() w modelach
Zmienił się typ danych zwracanych przez metodę find(), teraz zawsze zwracany jest obiekt klasy Zend_Db_Table_Rowset, niezależnie od ilości wyników. Trzeba w związku z tym zmienić obsługę danych odebranych za pomocą tej metody, najłatwiej można to zrobić dodająć wywołanie metody current():
-
<?php
-
$model->find($foo);
-
// zmienić na
-
$model->find($foo)->current();
-
?>
W związku z tą zmianą trzeba też zmienić typ danych zwracanych przez nadpisaną w modelu metodę find(). Jeśli w klasie modelu nie nadpisujemy tej metody, to można to pominąć.
8. Przekierowania
W wersji 1.0.0 RC1 pojawił się problem z działającymi do tej pory przekierowaniami, mianowicie przestała działać opcja PrependBase. W moim przypadku udało się rozwiązać ten błąd zmieniając jedną linijkę w klasie Zend_Controller_Action_Helper_Redirector:
Wydaje mi się, że jest to wina błędu w tym pliku, z tego co czytałem do obsługa przekierowań ma być poprawiona w wersji RC2.
9. Filtrowanie danych przychodzących
Tymczasowo przygotowałem klasę Foo_Filter_Input, aby przyspieszyć migrację przez opóźnienie wdrożenia w aplikacji komponentu Zend_Filter_Input:
-
<?php
-
class Foo_Filter_Input extends Zend_Filter_Input
-
{
-
protected $_source = NULL;
-
-
public function __construct(&$source = NULL, $strict = TRUE)
-
{
-
$this->_source = $source;
-
-
if ($strict) {
-
$source = NULL;
-
}
-
}
-
-
public function __call($method, $args)
-
{
-
if (!$this->keyExists($key)) {
-
return false;
-
}
-
-
-
return Zend_Filter::get($this->_source[$args[0]], $method);
-
}
-
-
public function keyExists($key)
-
{
-
}
-
-
}
-
?>
Dodatkowo trzeba zmienić wywołania filtra noTags:
-
<?php
-
$input->noTags('foo');
-
// zmienić na
-
$input->getStripTags('foo');
-
?>
Jesto jednak rozwiązanie tymczasowe, docelowo warto wdrożyć komponent Zend_Filter_Input.
10. Klasa ViewRenderer
Domyślnie włączoną klasę pomocniczą ViewRenderer tymczasowo wyłączyłem w pliku ładującym za pomocą:
-
<?php
-
$front->setParam('noViewRenderer', true);
-
?>
Docelowo warto będzie ją jednak włączyć, aby cały proces generowania widoków odbywał się automatycznie, jednak na razie brak jest obsługi layoutów, czegoś w stylu Master Pages w ASP.NET, więc nie jest to jeszcze zbyt wygodne.
W nowej wersji pojawia się też plugin ErrorHandler, do tej pory używałem podobnego własnego plugina, więc po prostu go zastąpiłem.
Oczywiście mogą być konieczne jeszcze inne zmiany, których tu nie opisałem, z tego względu, że w mojej aplikacji nie używam wszystkich komponentów, a w nich także mogły pojawić się zmiany.
Więcej szczegółów na temat migracji dla klas MVC można znaleźć w dokumentacji w rozdziale na temat migracji z wersji 0.9.3 do 1.0.0RC1



Dobry tekst. Gratuluję. Ja przechodziłem z wersji 0.6 do 0.9 i także musiałem zastosować pewne obejścia. Jak chociżby wyłączenie inicjalizacji widoku, ponieważ miałem napisaną już własną obsługę widoków od wersji 0.2. Czas jednak byłoby zabrać sie za napisanie aplikacji niemalże od początku w stylu 1.0
Pozdrawiam!