Zend Expressive 2 - microframework dla zaawansowanych

Wiadomość dodana: 15 marca 2017.

Trochę ponad rok temu – w styczniu 2016 roku – wydana została pierwsza stabilna wersja microframeworka Zend Expressive. Jego głównym założeniem były, w porównaniu do Zend Framework, minimalizm oraz praca w koncepcji middleware. Polega ona na tym, iż programista dostaje pewną strukturę bazową a swój kod osadza w postaci niezależnych klocków rozumianych jako warstwy. Kiedy jedna warstwa kończy pracę, przekazuje cały wynik działania do warstwy kolejnej – rozwiązanie można porównać luźno do JS-owych Promise. Projekt na tyle przypadł programistom do gustu że właśnie pojawiła się odświeżona wersja.

Główne zmiany w Zend Expressive 2.0 są skutkiem zaakceptowania nowych rekomendacji PSR (nad którymi pracuje zarazem główny architekt Zendowych komponentów – Matthew Weier O’Phinney). Dzięki zaakceptowaniu PSR-11 zmieniła się przestrzeń nazw z `Interop\Container\ContainerInterface` na `PSR\Container\ContainerInterface` (w okresie przejściowym, w wielu komponentach Zenda będą wykorzystywane jednoczesne implementacje obu interface). Kolejna poważna zmiana dotyczy PSR-15. Dotychczasowy kod przykładowej akcji przyjmował postać:

public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next = null);

Po zmianach powinien być implementowany interface `Interop\Http\ServerMiddleware\MiddlewareInterface` który deleguje akcje do kolejnego middleware:

public function process(ServerRequestInterface $request, DelegateInterface $delegate);

Wiele na plus zmieniło się w obsłudze błędów. Zostały znacznie uporządkowane, stały się dużo bardziej intuicyjne i czytelne. Przykładowe implementacje można podejrzeć w dokumentacji.

Kolejna rzecz dotyczy tzw. “programmatic pipelines”. Pipeline jest kolejką wykonywaną w porządku FIFO (first-in-first-out). W Zend Expressive 1 cała konfiguracja zawarta była w zewnętrznych plikach, w których ustalany był także priorytet wykonywania. Od Zend Expressive 2 kolejki powinno się definiować programistycznie np:

$app->pipe(ErrorHandler::class);
$app->pipe(ServerUrlMiddleware::class);

Osobiście bardzo sceptycznie podchodzę do takiego rozwiązania ale twórcy Expressive twierdzą, że jest to rozwiązanie łatwiejsze i dużo bardziej czytelne – w szczególności dla początkujących programistów. Aby ułatwić przejście do “kolejek programistycznych” stworzono narzędzie, które przeszukuje obecne pliki i wyciąga niezbędne informacje.

composer require --dev zendframework/zend-expressive-tooling
./vendor/bin/expressive-pipeline-from-config generate

W nowej wersji pojawiła się też możliwość tworzenia modułów aplikacji (podobna do modułów obecnych w ZF). Jest to na pewno miły dodatek, chociaż dzięki rozproszonej architekturze frameworka dodanie modułów do v1 było dość proste.

Siłą Expressive jest na pewno jego dywersyfikacja. Instalator oferuje kilka systemów szablonów, routerów oraz service managerów. Te zostały już dopasowane do nowej wersji, wykonując aktualizację programista nie powinien zauważyć żadnych problemów.

Czy warto korzystać z Zend Expressive? Moim zdaniem tak. Proste strony wizytówki czy mniejsze blogi wykonuje się w nim przyjemnie i szybko. Framework jest bardzo nowoczesny, napisany z uwzględnieniem najlepszych praktyk. Koncepcja “middleware” do mnie osobiście bardzo przemawia. Przy większych projektach sprawa staje się już dyskusyjna. Nie jest co prawda problemem wykorzystanie komponentów Zenda (typu zend-db czy zend-form), jednak nakład pracy potrzebny do połączenia wszystkiego w całość, zarządzania tym w przyszłości, może przerosnąć ewentualne korzyści. Dlatego ja osobiście wybrałbym w takiej sytuacji kompleksowy framework.

Komentarze

Nie ma jeszcze żadnych komentarzy do wyświetlenia. Może chcesz zostać pierwszą osobą która podzieli się swoją opinią?

Dodaj komentarz

*
Nazwa zostanie wyświetlona wraz z komentarzem. Możesz też utworzyć nowe konto w serwisie, dzięki czemu uzyskasz dodatkową funkcjonalność.
*
Akceptowana jest ograniczona składnia Textile. Wszystkie tagi HTML zostaną usunięte.