Wprowadzenie do Zend Framework 3

Artykuł dodany: 16 września 2016.

Stopień trudności (1 - dla początkujących, 5 - dla ekspertów): 1

Historia

Początki Zend Framework sięgają 2005 roku kiedy to zostały zaprezentowane pierwsze szkice oraz ogólny plan rozwoju. Wprowadzenie tak zaawansowanego rozwiązania było ogromnym krokiem na drodze zmierzającej do uporządkowania, chaotycznego w tamtym okresie, kodu stron internetowych pisanych w PHP. Trzeba pamiętać że nie istniał wtedy jeszcze menedżer pakietów Composer czy standard PSR. Większość amatorskich witryn oparta była o dowolnie porozrzucane w kodzie funkcje, klasy oznaczało się dodając do nazwy pliku sufiks `.class.php`, a wzorzec MVC znany był głównie w innych językach (Python, Ruby). Co zmieniło wprowadzenie ZF1? Programiści dostali spójne, monolityczne narzędzie ogromnie ułatwiające pisanie kodu. Framework zawierał w sobie wszystkie niezbędne elementy do tworzenia zarówno małych jak i dużych portali – zaczynając od routingu, przez całą warstwę MVC, obsługę formularzy, baz danych, maili, zabezpieczenia czy nawet komunikację z zewnętrznymi usługami. Projekty stały się spójne i jednolite, bardziej przenośne, a dobrze napisany kod całego frameworka podniósł umiejętności niejednego programisty. Z czasem ZF1 również ewoluował, zwłaszcza mocne zmiany przeszedł po wydaniu wersji 1.8 gdzie pojawiło się Zend_Application – pakiet ułatwiający `bootstraping` całej aplikacji czyli konfigurujący środowisko uruchomieniowe.

W roku 2010 pojawiła się pierwsza wersja Zend Framework 2. Jest to okres w którym język PHP przeszedł zmiany wprowadzając przestrzenie nazw na których ZF2 bazował. Zmieniła się koncepcja frameworka – zaczęto odchodzić od wielkich struktur na rzecz mniejszych kawałków kodu, tak zwanych modułów. Moduł miał za zadanie wykonywać tylko określoną funkcjonalność (np. rejestrację i logowanie użytkownika, sprawdzenie uprawnień i odpowiednie przekierowania w razie niepowodzenia) oraz być łatwy do testowania. Chociaż koncepcja była bardzo słuszna to moim zdaniem sam język nie dorósł jeszcze wtedy do tak pisanego kodu. Na framework padła fala krytyki. Przede wszystkim przez zastosowanie kontenerów DI (Dependency Injection Container) całość okazała się bardzo wolna. Projekt napisany w ZF2 działał nawet wolniej niż ten uruchomiony przy użyciu ZF1 – który do demonów szybkości bynajmniej nie należał. Drugim zarzutem był brak dokumentacji – napisana była w sposób niezrozumiały, wiele aspektów zostało pominiętych albo opisanych tylko po trosze. Aby zrozumieć działanie należało się bardzo często odnosić do kodu samego frameworka. Zaginęła gdzieś dobra komunikacja pomiędzy społecznością a teamem Zenda, co szczególnie widoczne stało się po pierwszej publikacji informacji o ZF3. Pojawił się wstępny artykuł o pracach nad nową wersją i przez rok czasu programiści otrzymywali wyrywkowe informacje o postępach prac. Żaden z ustalonych terminów nie został dotrzymany i nie wiadomo było na jakim etapie znajduje się kod. Oczywiście nie przekreślało to całkowicie dotychczasowych dokonań i na bazie ZF2 powstało wiele bardzo dobrych, dużych projektów. Programiści otrzymali dodatkowo portal ZF Modules, będący agregatorem istniejących modułów. W międzyczasie ogromną popularność zyskał Composer co przełożyło się też na wygląd ZF. Od wersji 2.5 zaczęło się mozolne wydzielanie poszczególnych bibliotek frameworka jako niezależnych od siebie komponentów. Powiązania pomiędzy komponentami zostały sprowadzone do minimum co oznacza, że w praktyce możliwe stało się stosowanie naprzemiennie bibliotek Zenda oraz innych zewnętrznych, w zależności od aktualnych potrzeb. Taka też główna idea przyświecała powstaniu Zend Framework 3. Zgodność ze standardami oraz modułowość.

Zend Framework 3

Zend Framework w wersji 3 wydany został 28 czerwca 2016 roku. Charakteryzują go 4 atrybuty:

- wydajność
- rozszerzalność
- bezpieczeństwo
- gotowość do pracy w środowiskach “Enterprise”

Przestarzały i wolny komponent Zend\Di został zastąpiony napisanym od nowa Zend\Servicemanager, który według testów jest nawet 4-krotnie szybszy. Rozszerzalność osiągnięto dzięki bazowaniu na Composer oraz przestrzeganiu rekomendacji PSR. Bezpieczeństwo ma zapewniać kod napisany według najlepszych praktyk. Natomiast gotowość do pracy w środowiskach “Enterprise” oznacza wieloletnią obecność frameworka w kluczowych dla biznesu aplikacjach, projekty zewnętrzne takie jak Zend Studio, Zend Server oraz oddelegowani przez firmę Zend Technologies programiści, na czele z Matthew Weier O’Phinney. Cały framework jest przystosowany do działania z PHP 7, a na chwilę obecną bibliotekę jako całość tworzy ponad 60 komponentów.

Dużo mówię o komponentach a jakie są te najczęściej używane?

- Zend\Mvc – jądro całej aplikacji. Odpowiada za obsługę wzorca Model-Widok-Kontroler – łączy dane wejściowe, wprowadzone przez użytkownika do systemu z logiką aplikacji (np. rejestrację użytkownika, pobranie danych z bazy, wysłanie maili) po czym wysyła odpowiedź (HTML, JSON, itp) ponownie do użytkownika. Innymi słowy odpowiedzialny jest za wszystko to, co dzieje się pomiędzy wysłaniem żądania (Request) a odpowiedzią (Response). Co ciekawe, mamy do wyboru 2 sposoby działania – tradycyjny MVC oraz Middleware. Więcej o tym w późniejszych częściach poradnika.

- Zend\ServiceManager – implementacja wzorca Service Locator. W skrócie, jest to centralny rejestr wszystkich dostępnych w aplikacji usług (trochę podobny do znanego w Zend Framework 1 wzorca Registry). W ZF3 usługi wczytywane są na życzenie, w chwili ich pierwszego wywołania. Takie podejście do aplikacji powoduje, że bardzo łatwo jest wymieniać inicjowane klasy, ale też zyskujemy oczywiście na zasobach.

- Zend\EventManager – komponent odpowiedzialny za obsługę zdarzeń. Polega to na tym, iż system zawiera informacje o możliwych do wykonania “eventach”, po czym wysyła powiadomienie jeśli zdarzenie nastąpiło. Przykładowo komponent Zend\Mvc może poinformować że miało miejsce wyświetlenie widoku, a my przechwytujemy dane i dodajemy jeszcze coś dodatkowo.

- Zend\ModuleManager – w ZF3 wszystko jest modułem (nawet poszczególne komponenty). Module Manager odpowiedzialny jest za ich wczytywanie, łączenie konfiguracji, odpalanie odpowiednich zdarzeń.

- Zend\Http – Komponent zajmuje się obsługą protokołu HTTP. Możemy dzięki niemu manipulować nagłówkami, treścią odpowiedzi oraz odczytywać dane wejściowe.

- Zend\Form – wszystko co dotyczy formularzy. Dzięki Zend\Form jesteśmy w stanie wykreować programistycznie cały formularz, jego poszczególne elementy (pola input, textarea, elementy fieldset itp), oraz wyświetlić je na stronie.

- Zend\InputFilter – odpowiada za reguły filtrowania i walidacji danych. Do działania wykorzystuje komponenty Zend\Filter oraz Zend\Validator. Używany w połączeniu z Zend\Form lub oddzielnie.

- Zend\Filter – zawiera zbiór metod operujących na danych wejściowych powodujący je przekształcenia, służy do odfiltrowywania danych. Przykładowo Zend\Filter\Digits usuwa z ciągu wejściowego wszystkie znaki oprócz uznawanych za cyfry, Zend\Filter\StringToLower powoduje przekształcenie znaków na odpowiedniki pisane małymi literami itd. Komponent odrobinę niefortunnie nazwany, na początku może wywoływać odrobinę zmieszania u programisty zaczynającego przygodę z ZF, jeśli wziąć pod uwagę wcześniej opisany komponent `InputFilter`.

- Zend\Validator – służy do walidacji danych wejściowych. Walidacja jest poprawna tylko wtedy, jeśli zostały spełnione określone warunki np.: ciąg zawierał tylko znaki alfanumeryczne.

- Zend\I18n – odpowiada za tłumaczenia w aplikacji. Jeśli jest aktywny a tłumaczenie odnalezione, przetłumaczy także komunikaty pochodzące np. z Zend\Form. Języki (w tym polski) zawarte są w dodatkowym komponencie `zend-i18n-resources`.

- Zend\View – komponent będący literą V w MVC czyli odpowiedzialny jest za warstwę widoku. Zawiera renderowanie odpowiednich plików – tak zwanych `layoutów`, posiada również sporo klas pomocniczych (helperów) odpowiedzialnych m.in. za utworzenie prawidłowego `doctype` dokumentu czy wygenerowaniu adresu URL.

- Zend\Db – komponent odpowiedzialny za warstwę abstrakcji bazy danych, opcjonalnie implementuje wzorzec Table Gateway. Obsługuje wszystkie silniki baz danych jak Oracle, MySQL, PostgreSQL, SQLite, MSSQL.

- Zend\Session – służy do obsługi sesji. Posługuje się pojęciem kontenerów które grupują określone funkcjonalności. Przykładowo kontener `User` może zawierać dane o użytkowniku, inny kontener `App` dane ogólne o aplikacji. Każdy kontener może posiadać niezależne opcje np. automatyczne usunięcie po określonym czasie czy liczbie odsłon.

- Zend\Permissions\Acl – komponent zajmuje się przydzielaniem uprawnień dla określonych wcześniej ról.

Po powyższych przykładach widać, iż każdy znajdzie komponent dla siebie nawet, jeżeli nie chce wykorzystywać pełnej funkcjonalności MVC. Warto jeszcze przy okazji wspomnieć o Zend\Expressive. Jest to mikroframework bazujący na koncepcji middleware, PSR-7 oraz oczywiście innych komponentach Zenda. Kiedy nie potrzebujemy pełnej funkcjonalności MVC jest to bardzo dobre, szybkie rozwiązanie. Jako ciekawostkę można wspomnieć, iż cała nowa strona Zend Framework napisana jest właśnie w Zend Expressive a jej źródło można podejrzeć na Github.

Podsumowanie

Ewolucja oprogramowania w ciągu ostatnich kilku lat sprawiła, że kod stał się modularny, testowalny, pisany zgodnie z najwyższymi standardami. Zend Framework w ciągu 11 lat obecności na rynku przebył bardzo długą drogę. Od monolitycznego frameworka do modularnych komponentów o minimalnych zależnościach. Kiedyś programistę ograniczał framework, obecnie tylko wyobraźnia i przeznaczone na projekt środki finansowe.

W kolejnej części zajmiemy się instalacją szkieletu aplikacji. Omówiona zostanie podstawowa konfiguracja, moduły użytkownika. Dla totalnie zielonych programistów pokazana zostanie instalacja systemu Composer.

Przydatne linki:
Zend Framework – strona projektu
Projekt na Github

Komentarze

  • Bardzo dobry artykuł, warto jednak dodać, iż Zend Framework dalej się rozwija oraz posiada świetne wsparcie dla API po przez komponent Apigility.

    Dodatkowo można w łatwy sposób połączyć szablony widoków jak Smarty i Twig oraz ORM: Doctrine.

    Narzędzie jest dość trudne w nauce, zwłaszcza, gdy nie ma dużo żródeł informacji na ten temat. Na szczęście są już 2 książki dostępne na Amazonie i Helionie, np: “Zend Framework 3. Developer’s Guide”, Adam Omelak.

  • Świetny artykuł. Kiedy kolejna część, instalacja konfiguracja?

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.