dominik bułaj

php developer & web designer

PoczÄ…tkowo dowiedziawszy siÄ™, iż do kolejnej wersji Zend Framework (mowa o 1.10.0), bÄ™dzie dodany komponent Zend_Serializer, pomyÅ›laÅ‚em “hej, czy to nie przesada opakowywać w klasÄ™ gotowe narzÄ™dzie dostÄ™pne w PHP”.
Chodzi mi głównie o standardowÄ… i JSONowÄ… serializacjÄ™ i deserializacjÄ™…

Dziś przeglądając dokładniej dokumentację sprawdziłem co tam jeszcze ciekawego wepchano. Okazało się, że komponent jest dość bardzo zaawansowanym narzędziem. Oferuje:

  • standardowÄ… serializacjÄ™ php
  • reprezentowanie danych w postaci WDDX
  • zapisanie obiektu, zmiennych w postaci JSON (korzysta z Zend_Json)
  • serializacjÄ™ do Amf (wykorzystuje Zend_Amf)
  • reprezentacjÄ™ danych z użyciem var_export(), a odtwarzanie wykorzystujÄ…c eval() — co wg mnie jest jakimÅ› żartem (przecież eval() to czyste zÅ‚o i potencjalna dziura w aplikacji!)
  • serializacjÄ™ z użyciem opensource Igbinary (binarna repezentacja danych)
  • i na koniec, chyba najwiÄ™ksze (pozytywne) zaskoczenie dla mnie – zpisywanie i odczytywanie danych w formacie Python Pickle

Połączenie PHP< ->Python do wymiany danych to coś dobrego. W końcu będzie możliwość wymiany danych bez potrzeby pisania osobnego (lub wykorzystywania gotowego) interfejsu.

Ostatnio, z różnych powodów, maÅ‚o byÅ‚em aktywny na sieci… mam nadzieje ze to siÄ™ zmieni. A zacznÄ™ od nadrobienia pewnych zalegÅ‚oÅ›ci.

Jak zapewne odnotowaliście, wydano już pełną wersję Zend Framework 1.10.0, a także dwie kolejne wersje pełne poprawek (tzw. minor releases). O wszystkim informował na bieżąco Mateusz Kamiński na swoim blogu.

Ja dodam tylko najświeższy news. Zaczęły się prace nad Zend Framework 2.0!
PoinformowaÅ‚ o tym głównodowodzÄ…cy projektem – Matthew Weier O?Phinney. Pierwsze rezultaty prac oczekiwane sÄ… już za kilka(naÅ›cie?) tygodni.

Na pierwszy rzut idÄ…:

  • usuniÄ™cie wywoÅ‚aÅ„ require_once()
  • aktualizacja testów
  • wykorzystanie namespace’ów dostÄ™pnych od PHP 5.3
  • testowanie alternatywnych systemów pluginów (docelowo majÄ… być bardziej wydajne i zrozumiaÅ‚e)

Dziś w nocy ukazała się pierwsza wersja kandydująca Zend Framework 1.10rc1. Można ją pobrać z oficjalnej strony aplikacji.
O nowych ficzerach przeczytacie na devzone.zend.com.

Przy okazji dziś uaktualniona została dokumentacja frameworka. Można teraz wybrać wersję na jakiej pracujemy, aby dostać dokumentację relatywną do możliwości naszej wersji ZF. Nową dokumentację znajdziecie pod starym adresem: http://framework.zend.com/manual/en/.

PS dostÄ™pna jest dokumentacja do kolejnej wersji – 1.10.

Dziś nad ranem czasu polskiego, ukazała się kolejna wersja Zend Framework. Jest to wydanie oznaczone jako 1.10.0 ALPHA, przeznaczone do testowania nowych funkcjonalności, a jest czego testować ;)

Nowe komponenty w Zend Framework 1.10

  • Zend_Barcode
  • Zend_Cache_Backend_Static
  • Zend_Cache_Manager
  • Zend_Exception (wsparcie dla poprzedzajÄ…cych wyjÄ…tków; markuje rozwiÄ…zanie dostÄ™pne od PHP 5.3.0)
  • Zend_Feed_Pubsubhubbub
  • Zend_Feed_Writer
  • Zend_Filter_Compress/Decompress
  • Zend_Filter_Null
  • Zend_Log::factory()
  • Zend_Log_Writer_ZendMonitor
  • Zend_Markup
  • Zend_Service_LiveDocx
  • Zend_Service_WindowsAzure
  • Zend_Validate_Barcode
  • Zend_Validate_Callback
  • Zend_Validate_CreditCard
  • Zend_Validate_PostCode

Dodatkowo jak informuje, opiekujÄ…cy siÄ™ frameworkiem, Matthew Weier O’Phinney – dużej refaktoryzacji poddano Zend_Tool. Wyeliminowano masÄ™ błędów i niedociÄ…gnięć (wÄ…skie gardÅ‚a) oraz dodano nowe fukcjonalnoÅ›ci:

  • skrypt CLI z wsparciem dla katalogu domowego i możliwoÅ›ciÄ… konfiguracji
  • możliwość generowania modeli, konfiguracja adaptera bazodanowego, layoutów i formularzy
  • domyÅ›lnie generowany projekt bÄ™dzie wspieraÅ‚ logowanie błędów z ErrorControllera

Framework można pobrać, jak zawsze, z oficjalnej strony (pełny changelog na stronie pobierania po rozwinięciu panelu README).

Na koniec harmonogram na najbliższy miesiąc:

  • 1.10.0alpha1 – 21 grudnia 2009 (dziÅ›)
  • 1.9.7 – 5 stycznia 2010 (wtorek)
  • 1.10.0beta1 – 7 stycznia 2010 (czwartek) lub 8 stycznia (piÄ…tek)
  • 1.10.0rc1 – 14 stycznia (czwartek)
  • 1.10.0 – 21 stycznia (czwartek)

Powoli nadchodzi Zend Framework w wersji 2.0. Wcześniej zobaczymy Zend Framework 1.10, która prawdopodobnie będzie ostatnią wersją z obecnej gałęzi.
W wersji 2.0 szykuje siÄ™ wiele znaczÄ…cych zmian. Zacznijmy od tego, że framework bÄ™dzie przepisany. BÄ™dzie wykorzystywaÅ‚ namespace‘y, a wiÄ™c minimalne wymagania do uruchomienia to PHP 5.3.

Największy nacisk położony będzie na MVC. W mapie drogowej, umieszczonej niedawno na wiki, wypunktowano pakiety, które zostaną poddane refactoringowi. Są to:

  • Zend_Controller 2.0
  • Zend_Controller_Router 2.0
  • Zend_View 2.0
  • Zend_Session 2.0
  • Zend_Form 2.0

    Pozostałe komponenty, które zostaną przepisane:

  • Zend_Soap 2.0
  • Zend_Mail 2.0

Zmianie ulegnie także architektura pluginów, gdzie zostaną zastosowane nowe wzorce projektowe. A część kodu frameworka, która używa Singletona zostanie przepisana, gdyż w pewnych sytuacjach (głównie testowanie) sprawia problemy.
Więcej informacji na wiki.

Jak na razie nie wiadomo nic na temat planowanych terminów wydań 1.10 i 2.0.

WÅ‚aÅ›nie przed momentem, Matthew Weier O’Phinney poinformowaÅ‚ na stronach Zend Developer Zone o wydaniu Zend Framework 1.9.6.

W szóstym wydaniu poprawiającym wersję z gałęzi 1.9 skorygowano ponad 60 zgłoszonych błędów.

Dla zainteresowanych udostępniono szczegółowy dziennik zmian.
Najnowszą wersję frameworka można pobrać z oficjalnej strony.

Nowy projekt (a wÅ‚aÅ›ciwie dwa) majÄ… zostać oparte o Zend Framework. Niby wszystko piÄ™knie – no bo mamy “zajefajny” framework, który zrobi niemal wszystko (brakuje tylko faktu, że kawy nie parzy ;) ).

Chcąc mieć projekty pięknie od początku wykonane z użyciem Zend_Tool i Zend_Application generuje strukturę dokumentu. Przy czym, w ZF 1.8 zaleca się trzymanie wszystkich ustawień w konfiguracyjnym pliku INI (w celu odchudzenia klasy Boostrap).
WracajÄ…c do projektu – od razu zakÅ‚adam panel administracyjny – tworzÄ™ osobny moduÅ‚.
Moduł ten będzie obsługiwał kontrolę dostępu i autentyfikację opartą o bazę danych. Żeby nie powielać kodu dziesiątki razy chcę stworzyć plugin kontrolera, który sprawdzi czy a. user jest zalogowany; b. ma dostęp do zasobu. I tu zonk.

W dokumentacji jest napisane, że w pliku INI można podać listę pluginów:

plugins: array of front controller plugin class names. The resource will instantiate each class (with no constructor arguments) and then register the instance with the front controller.

W przykładzie wygląda to tak:

resources.frontController.plugins.foo = "My_Plugin_Foo"
resources.frontController.plugins.bar = "My_Plugin_Bar"

Niby wszystko jasne, tworzÄ™ dwie klasy dziedziczÄ…ce po Zend_Controller_Plugin_Abstract… Teoretycznie powinienem mieć możliwość wywoÅ‚ania metody preDispatch(), która może sprawdzić czy użytkownik jest zalogowany i czy ma prawa do zasobu. JeÅ›li nie to, w zależnoÅ›ci od sprawdzenia, albo przekierować go na formularz logowania, albo wyÅ›wietlić stronÄ™ z informacjÄ… o braku dostÄ™pu.
Teoretycznie – bo ten kod nie dziaÅ‚a (błąd Å‚adowania klasy, mimo że jest ona w include_path)!
Co wiÄ™cej straciÅ‚em dziÅ› 2 godziny na znalezienie “obejÅ›cia”. ObejÅ›cie to nic innego jak stworzenie metody _initPlugins() w Bootstrap i po staremu dodanie pluginów do front kontrolera:

protected function _initPlugins()
{
    $front = $this->bootstrap('frontController');
    $front->registerPlugin(new My_Plugin_Foo());
}

Przy okazji przejrzałem dokładniej dokumentację ZF i takie oto wnioski przyszły mi do głowy:

  • ZF to straszna kobyÅ‚a, która sama w sobie nie trzyma standardów – można to samo wykonać na 3 różne sposoby (framework chyba powinien narzucać jeden standard!?)
  • oficjalna dokumentacja jest nieaktualna
  • API tez nieaktualne (Zend_Version) pokazuje numer 1.9.3
  • jedynÄ… pomocÄ… sÄ… fora i bugtracker ZF

Do kolejnego razu! (oby można byÅ‚o powiedzieć coÅ› in-plus…)

Rozumiem, że rozwój najpopularniejszego frameworka dla php, wymusza aktualizacje co jakiś czas. Nie rozumiem jednak dlaczego one są robione tak często! Czy nie można core framworka udostępnić oddzielnie a całą resztę (mało ważne moduły) wydawać jako dodatek. W ten sposób dodanie nowych dwóch Zend_Services_XXX nie powodowałoby konieczności zmiany numeracji całego frameworka?

Inna sprawa, że wiecznie poprawiane są błędy z poprzednich wydań. Czy nie można wydać czegoś dobrze sprawdzonego? Byłoby mniej kłopotów, a tak co miesiąc trzeba aktualizować framework (i nanosić poprawki w kodzie aplikacji, jeśli zmiany nie są kompatybilne wstecznie). CakePHP jest dostępny na dzień dzisiejszy w wersji 1.2.5, Symphony (do wyboru branche) 1.0 i 1.2.

A Zend Framework?
Wydana wczoraj wersji 1.9.3 po kilkudziesięciu minutach była już przeszłością. Szybko udostępniono 1.9.3PL1.

Rozumiem, że znaleziono błąd krytyczny, ale gdzie byli beta-testerzy?!

Wszystko to powoduje, że coraz bardziej jestem rozczarowany produktem firmowanym jako “w peÅ‚ni przetestowany” (Fully Tested – Extend Safely and Easily).

Zend Framework 1.9.0

Zend Framework31 lipca, wydano nową wersję Zend Framework, oznaczoną 1.9.0. Jest to kolejna wersja wydana w ostatnim kwartale. Tempo ogromne, o czym świadczy fakt, iż wersji 1.8 (wydanej w maju) poprawiono około 700 zgłoszonych błędów!

Lista nowości jest długa, poniżej ważniejsze z nich:

  • Zend_Rest_Route, Zend_Rest_Controller i Zend_Controller_Plugin_PutHandler – warstwa MVC layer dla serwisów REST
  • Zend_Feed_Reader – API dla RSS/Atom
  • Zend_Db_Adapter_Sqlsrv – Zend_Db adapter dla Microsoft SQL Server
  • Zend_Test_PHPUnit_Db – testowanie zapytaÅ„ do baz danych z poziomu PHPUnit
  • Zend_Dojo w wersji 1.3.2.
  • usprawnienia w Zend_Ldap
  • Zend_Log_Writer_Syslog – logowanie od dziennika systemowego
  • Zend_View_Helper_BaseUrl – helper zwracajÄ…cy URL bazowy aplikacji
  • Zend_Date z obsÅ‚ugÄ… rozszerzenia DateTime
  • Zend_Locale zostaÅ‚o uaktualnione do wersji CLDR 1.7
  • Zend_Translate – obsÅ‚uga liczby mnogiej w adpterach: Gettext, Csv i Array
  • kompatybilność ZF z PHP 5.3, w tym wsparcie dla nowych funkcji MySQLi

Framework można pobrać, jak zawsze, z oficjalnej strony (lista zmian).

PoczÄ…wszy od wersji 1.8, Zend Framework posiada caÅ‚kowicie przepisany Zend_Loader. Nie majÄ…c czasu na “peÅ‚nÄ… migracjÄ™” (czyt. wymagane zmiany w kodzie), po aktualizacji biblioteki do wersji 1.8.x zobaczymy warning informujÄ…cy, iż Zend_Loader::registerAutoload(); jest przestarzałą metodÄ… i że w wersji 2.0 zostanie usuniÄ™ta.

Co zatem zrobić, jeśli nie mamy czasu (lub ochoty) na grzebanie w kodzie i podpinanie Zend_Application (wsparcie bootstrapu)?

Prostym rozwiązaniem będzie zamiana:

require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

na

require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

To wszystko! Aplikacja działa od tej chwili poprawnie z najnowszą wersją Zend Framework. Dodatkowo Zend_Loader zachował stary tryb działania ;)

Po skoÅ„czeniu udoskonaleÅ„ i dokonaniu kilku poprawek na PinkCrow, postanowiÅ‚em w koÅ„cu zmigrować witrynÄ™ zawierajÄ…cÄ… moje portfolio do ostatniej wersji Zend Framework, czyli 1.8.1. A zmian bÄ™dzie od groma. Od wprowadzenia dawno planowanych obsÅ‚ug layoutu i formularzy przez użycie najnowszych “gadżetów” Zend_Application, Zend_Navigation etc.

Ale do rzeczy… Jako że lokalnie używam svn (historia zmian, tagowanie wersji, etc.) katalog z bibliotekÄ… Zend’a mam podpiÄ™ty przez svn:externals.
SzukajÄ…c Å›cieżki do wersji otagowanej jako “release-1.8.1″ natrafiÅ‚em na tag “release-1.8.2″.

W pliku README.txt czytamy:

Zend Framework 1.8.2 Release ([INSERT REV NUM HERE]).
Released on May 27, 2009.

Zatem wychodzi na to, że tego newsa publikuję wcześniej niż oficjalna strona frameworka!

Inna ciekawostka, plik LICENSE.txt zawiera zakres dat 2005-2008 – ot takie maÅ‚e przeoczenie ;)

Bardzo szybko wydano pierwszą poprawkę do Zend Framework 1.8, który oficjalnie zaprezentowano dokładnie 13 dni temu.
Co ciekawe, ekipa tworzÄ…ca framework chwali siÄ™, iż w tym czasie zrobiÅ‚a aż 68 poprawek. Nachodzi mnie pytanie – cieszyć siÄ™ czy pÅ‚akać?! Nie bardzo rozumie wydawanie czego co nie jest sprawdzone dwa/trzy razy. Okazuje siÄ™, że błędy byÅ‚y nawet w przykÅ‚adach dokumentacji – Quick Start!.

No ale do rzeczy – z grubszych poprawek wykonano:

  • zamieniono wersjÄ™ Dojo dołączonÄ… do frameworka (1.2 na 1.3)
  • Zend_Loader::registerAutoload() jest aliasem do Zend_Loader_Autoloader
  • poprawiono i udoskonalono Zend_Application
  • dodano generowanie modułów i elementów wewnÄ…trz modułów (Zend_Tool) — w koÅ„cu!
  • dodano usprawnienia do Zend_Amf

Lista wszystkich błędów znajduje siÄ™ w ZF issue trackerze, a najnowszÄ… wersjÄ™ – Zend Framework 1.8.1 można poprać ze strony http://framework.zend.com/download

Właśnie ukazał się Zend Framework w wersji 1.8 Beta 1. jest to kolejna wersja testowa przed finalną zapowiedzianą na koniec miesiąca.

Z głownych nowości:

  • Zend_Application (wsparcie dla bootstrapu)
  • Zend_Tool (generowanie projektów i komponentów)
  • Zend_CodeGenerator (IMHO narzÄ™dzie nieprzydatne)
  • Zend_Navigation (generowanie sitemap’ów i drzew linków)
  • Zend_Reflection (rozszerzenie możliwoÅ›ci php’owego reflection)
  • Zend_Tag (praca z tagami (etykietami))
  • dodatki i usprawnienia w Zend_Validate i Zend_Filter
  • usprawnienia w Zend_Search_Lucene i Zend_Pdf
  • nowa obsÅ‚uga uploadowanych plików w Zend_Form_Element_File

.

NajnowszÄ… wersjÄ™ można pobrać z oficjalnej strony framework‘a.

Dziś także ukazuje się nowa wersja Ubuntu. Ubuntu 9.04 nazwane Jaunty Jackalope.

REST to usÅ‚uga sieciowa używana do dystrybuowania treÅ›ci – głównie – pomiÄ™dzy aplikacjami internetowymi (tzw. web service). REST nie jest jedynym dostÄ™pnym web service; innymi popularnymi usÅ‚ugami sÄ… m.in. XML-RPC oraz SOAP.

Jako że REST jest prostym i lekkim protokoÅ‚em, jest on – obok XML-RPC – najczęściej wykorzystywany we wszelkiego rodzaju API (Application Programming Interface).
Jest lekki, bo wszelkie requesty są standardowymi żądaniami HTTP (wykorzystywane są przy tym metody GET, POST, PUT oraz DELETE). Odpowiedzi są standardowymi odpowiedziami serwera (nagłówki + treść), przy czym status odpowiedzi informuje o błędzie (np. 404 Not Found dla nieznanej metody, 401 Unauthorized w przypadku braku lub błędnej autoryzacji, 200 OK informujący o powodzeniu operacji).

W Zend Framework mamy gotowy komponent do obsługi REST, dzięki niemu możemy łatwo stworzyć zarówno klienta (Zend_Rest_Client), jaki i serwer (Zend_Rest_Server).

Serwer REST zbudowany z wykorzystaniem Zend_Rest_Server:

$rest = new Zend_Rest_Server();
$rest->setClass('MyClass');
$rest->handle();

Komunikujemy się z serwerem REST używając Zend_Rest_Client:

$restClient = new Zend_Rest_Client('http://example.com/api/rest');
$restClientResponse = $restClient->getDate()->get();

if ($restClientResponse->isSuccess()) {
    echo $restClientResponse;
}

WydawaÅ‚oby siÄ™, że to kompletne rozwiÄ…zanie – możemy zarówno coÅ› udostÄ™pnić, jak również odpytać. Niestety tak nie jest!
ZF umożliwia obsługę REST tylko z wykorzystaniem formatu XML. Co zatem mamy zrobić jeśli chcemy wykorzystać REST API obsługujące tylko format JSON (obok XML najczęściej stosowany format REST)?

RozwiÄ…zanie jest proste – do odpytania REST API w formacie JSON wykorzystamy Zend_Http_Client, a wynik dekodujemy korzystajÄ…c z Zend_Json.

Przykład odpytania REST API obsługującego format JSON:

$httpClient = new Zend_Http_Client('http://example.com/api/json');
$httpClient->setHeaders('Accept: application/json');
$httpClientResponse = $httpClient->request('get')->getBody();

OK, wiemy już zatem jak odpytać API obsługujące format JSON, wiemy też jak wykorzystać Zend_Rest do budowy/odpytania API wykorzystującego XML.
Co jeśli chcemy utworzyć serwer REST oferujący dane w formacie JSON (oraz XML)?

Musimy wykonać sprawdzenie – nagłówka Accept – i w zależnoÅ›ci, czy znajdzie siÄ™ tam application/json, czy nie, odpowiedzieć w odpowiednim formacie (domyÅ›lnie XML).

$rest = new Zend_Rest_Server();

$rest->setClass('MyClass');

$rest->returnResponse(true);
 // informujemy moduł, że chcemy przechwycić dpowiedź Zend_Rest_Server do zmiennej...
$response = $rest->handle();
 // ...i to też robimy, wywołują metodę handle()

// domyślny typ danych (xml)
$contentType = 'text/xml';

// sprawdzamy czy zadano danych JSON
if (preg_match('/(application\/json)/', $this->getRequest()->getServer('HTTP_ACCEPT'))) {

    // konwertujemy dane XML => JSON
    $response    = Zend_Json::fromXml($response, true);

    // nagłówek dla danych JSON
    $contentType= 'application/json';
}

// zwracamy dane ($response) z odpowiednim nagłówkiem Content-type
$responseObject = $this->getResponse()->setBody($response)->setHeader('Content-type', $contentType, true);

// pozostaje jeszcze wysłanie odpowiedniego statusu, zgodnie ze specyfikacją REST
$restHeaders = $rest->getHeaders();

// pobieramy nagłówki (drugi element tablicy - jeśli wystąpił błąd - zawiera status błędu)
if (isset($restHeaders[1])) {
    $responseObject->setRawHeader($restHeaders[1]);
}

Gotowe! Teraz możesz udostępnić własne API lub wykorzystać jedno z dostępnych :)

Zend_Form i XHTML

Zend_Form, mimo że bardzo sÅ‚abo udokumentowany i toporny w konfiguracji, jest przydatnym elementem Zend Framework‘a. Niestety, domyÅ›lnie generuje znaczniki HTML a nie XHTML, co uniemożliwia walidacjÄ™ kodu strony.

Jest na to wyjście.

Wystarczy w pliku bootstrap.php dodać następującą definicję doctype:

$view = new Zend_View();
$view->setEncoding('UTF-8');
$view->doctype('XHTML1_TRANSITIONAL');

$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

Metoda doctype (klasa Zend_View_Helper_Doctype) przyjmuje jedną z wartości:

  • XHTML11
  • XHTML1_STRICT
  • XHTML1_TRANSITIONAL
  • XHTML1_FRAMESET
  • XHTML_BASIC1
  • HTML4_STRICT
  • HTML4_LOOSE
  • HTML4_FRAMESET
  • HTML5
  • CUSTOM_XHTML
  • CUSTOM

Archiwa