Projektowanie i architektura frameworka w języku PHP Tomasz P.F. Kowalczyk http://kowalczyk.cc
Spis treści Why new framework? Mechanizmy języka PHP Wzorce projektowe Architektura Przepływ sterowania Zalety i wady Podsumowanie 2
Why new framework? I Tried some of them Symfony CakePHP Zend Framework Too much "frame", not enough "work" Complicated structure Flat learning curve Attempt to create "final product" Absolutely essential features, yet useful tool 3
Why new framework? II Writing new framework is a bad idea Programming is full of bad ideas That's why I'm going to do it ;] Personal view Wish to have something "own" Compare result with other projects Deal with problems in such project Verify my skills and experience Test all the ideas I had through years 4
Mechanizmy języka PHP Nowości znane z PHP 5.3 Przestrzenie nazw [namespaces] namespace ThunderFrame\Controllers; Autoloading z wykorzystaniem przestrzeni nazw Stała CLASS zawiera przestrzeń nazw klasy require_once( CLASS.'.php'); Late Static Binding Dziedziczenie statycznych metod 5
Wzorce projektowe Model View Controller [MVC] Dependency Injection [DI] Design by Contract [DbC] Layer Supertype 6
Model View Controller Próba implementacji "prawdziwego" MVC Czym jest "prawdziwe" MVC? CCV Model to nie CRUD na tabelach CCC Widok to nie tylko wyświetlanie zmiennych Wszystko zależy od programisty Kontroler nie pobiera danych z modelu Widok korzysta wyłącznie z interfejsu modelu Każdy element ma jasno zdefiniowany cel Single Responsibility ["S" z zasady SOLID] 7
Dependency Injection I Tzw. "wstrzykiwanie zależności" Elementy decydujące są przekazywane do elementu zależnego. Drwal potrzebuje siekiery aby ściąć drzewo [uzyskać pień] $trunk = $lumberjack->cut(new Tree('Oak'), new Axe('wood')); Rodzaje "wstrzykiwania" Constructor injection Method injection 8
Dependency Injection II Inversion of Control [IoC] Duże elementy są zależne od mniejszych Dependency Injection Container Przekazywanie zależności w sposób usystematyzowany Poprzedni przykład $trunk = $lumberjack->cut(new DI_Container('tree' => new Tree('Oak'), 'axe' => new Axe('wood'))); 9
Design by Contract Znak towarowy zastrzeżony przez Eiffel Software, koncept pochodzi z języka Eiffel Koncept sterowania interfejsami zamiast klas bazowych Specyfikacja powinna definiować jakie akcje wykonują obiekty o określonym przeznaczeniu Przykład interface ICuttable { function cut($what, $with); } class LumberJack implements ICuttable {} class Tree implements ICuttable {} 10
Layer Supertype Struktura podzielona na warstwy o określonym przeznaczeniu Wszystkie klasy dziedziczą po odpowiedniej klasie bazowej danej warstwy Klasa bazowa może implementować interfejsy związane z funkcjonalnościami warstwy połączenie z wzorcem DbC Przykład class BaseTree implements ICuttable {} class Oak extends BaseTree {} 11
Architektura Router Kontroler Model Connector - "łącznik" Widok Partial Layout 12
Router Definiuje relacje pomiędzy parametrami żądania a elementami aplikacji internetowej Decyduje o wyborze kontrolera oraz parametrach wywołania, jakie zostaną do niego przekazane Pozwala na budowanie adresów URL na podstawie przekazanych parametrów 13
Kontroler Zarządza przepływem sterowania Wybiera akcję, którą należy wywołać i przekazuje do niej odpowiednie parametry Do niego należą wszelkie operacje związane z dostępem autoryzacja i uwierzytelnianie. Wybiera zestaw modeli oraz przekazuje ich instancje odpowiednim widokom 14
Connector Reprezentacja "połączenia" do źródła danych Przykładowe źródła danych Baza danych SQL Plik tekstowy [CSV, XML, YAML] Baza danych SQLite Struktura zapewniająca abstrakcję pozwalającą na uogólnienie "połączenia" na różne typy źródeł danych 15
Model Obiektowa reprezentacja pewnego bytu tworzonego z danych pobranych przy użyciu odpowiedniego Connectora Zawiera interfejs pozwalający wykonywanie żądanych operacji na danych powiązanych z tym bytem Model to nie reprezentacja tabeli w bazie danych! 16
Widok Ogólna reprezentacja wyjściowej formy odpowiedzi na żądanie Różne typy wyjściowego formatu danych: HTML XML PDF Widok sam pobiera dane z modelu poprzez odpowiednio zdefiniowane interfejsy 17
Layout Główny element kodu wynikowego, zawiera w sobie "partiale" mniejsze elementy, które można wykorzystać w wielu miejscach Pewien wariant wzorca Dekorator Kod wynikowy poszczególnych partiali jest pobierany i wstawiany przed wyświetleniem samego layoutu 18
Partial "Partial", ang. "część" Są to fragmenty strony, które można wyświetlać w layoucie Partiale mogą zawierać się w sobie, tworząc hierarchiczną strukturę zależności Przykłady podobnych rozwiązań: Moduły w Joomli Widgety w WordPressie 19
Przepływ sterowania Interpretacja żądania Router wybór kontrolera Dispatcher uruchomienie kontrolera Kontroler wybór akcji Akcja wybór modeli i widoków Widok generowanie kodu wyjściowego 20
Zalety i wady Zalety Rozszerzalna struktura Trwała architektura Wady Brak testów Wynajdywanie koła po raz kolejny 21
Podsumowanie Dziękuję za uwagę array_walk($sleepingpeople, ' wakeup'); Dziękuję za uwagę jeszcze raz Prezentacja będzie dostępna na moim blogu Google: "prezentacja na seminarium" Mam nadzieję, że było mniej "grobowo" Zmieniłem tło na jaśniejsze ;] 22
anyquestions('?') or die('the end'); 23