105

„Zjeść ciasteczko i mieć ciasteczko”, czyli szybkie wprowadzenie do CakePHP

Autorem wpisu jest Konrad Przydział. Gdy zaczynałem swoją przygodę z programowaniem stron internetowych, rzeczą, która sprawiała mi najwięcej problemów było organizowanie swojego kodu oraz sprawne wykorzystywanie pewnych możliwości PHP. Tak było dopóki nie poznałem frameworka – CakePHP. Tekst jest skierowany do osób, które mają podstawowe pojęcie o programowaniu obiektowym PHP i nigdy wcześniej nie miały […]

Autorem wpisu jest Konrad Przydział.
Gdy zaczynałem swoją przygodę z programowaniem stron internetowych, rzeczą, która sprawiała mi najwięcej problemów było organizowanie swojego kodu oraz sprawne wykorzystywanie pewnych możliwości PHP. Tak było dopóki nie poznałem frameworka – CakePHP.

Tekst jest skierowany do osób, które mają podstawowe pojęcie o programowaniu obiektowym PHP i nigdy wcześniej nie miały do czynienia z frameworkami MVC – uprzedzam, że w tekście mogą pojawić się pewne oczywistości i uproszczenia. Starych wyjadaczy CakePHP prosimy zatem o zrozumienie.

Po co nam ten cały framework?
By uniknąć problemów, o których wspominałem na wstępie niniejszego tekstu. Frameworki pozwalają w dużym stopniu uprościć i przyspieszyć pracę nad projektem. Gdybyśmy mieli przyrównać je do przedmiotu z życia codziennego to pokusiłbym się o miano „scyzoryka szwajcarskiego” – zwykle zawierają masę klas i funkcji, które sprawiają, że korzystając z jednego narzędzia (np. CakePHP) możemy wykonać cały ogrom różnych zadań w stosunkowo prosty sposób. Jednocześnie pełnią też funkcję szufladek – świetnie organizują nasz kod w odpowiednich strukturach specyficznych dla danego frameworku.

Przyznam, że osobiście nie widzę większego sensu jeśli chodzi o wykorzystywanie tak dużych frameworków w prostych projektach – obierając jabłko nie potrzebujemy szwajcarskiego scyzoryka. Mimo wszystko w naszych rozważaniach, będziemy opierać się na prostych przykładach.

Pamiętajcie: przerost formy nad treścią nie jest wskazany w programowaniu

MVC w CakePHP
Pierwszym i najważniejszym udogodnieniem CakePHP jest zastosowana w nim logika. Mamy tu do czynienia z frameworkiem MVC, a więc cała aplikacja jest podzielona na trzy warstwy:

  • Modelu (Model) – odpowiada za interakcję z bazą danych, zarówno pobieranie jej zawartości jak i zapisywanie do niej kolejnych porcji danych,
  • Widoku (View) – określa w jaki sposób wyświetlana jest informacja na naszej stronie,
  • Kontrolera (Controller) – przetwarza dane z modelu i przygotowuje je do wyświetlenia w widoku

Na poniższym rysunku widzimy w jaki sposób działa nasza aplikacja w oparciu o CakePHP.

mvc
Źródło.

Krok 1 i 2: Klient wysyła żądanie do serwera

Typowe żądanie dla CakePHP ma postać www.adres.pl/kontroler/akcja – Dyspozytor (Dispatcher) odbiera to zapytanie (1), analizuje i na jego podstawie określa, który kontroler ma być załadowany, a następnie która akcja (metoda obiektu kontrolera) dla danego kontrolera ma zostać wykonana (2).

Krok 3 i 4: Kontroler odwołuje się do modelu

Jest to etap, który niejednokrotnie może zostać pominięty, gdyż CakePHP nie wymaga wykorzystania warstwy modelu. Jeśli jednak korzystamy z niej, kontroler wywołując odpowiednie metody ładuje jeden lub kilka modelów i wysyła dzięki nim zapytanie do bazy danych (3), a następnie odbiera dane (4) i przetwarza je.

Krok 5: Kontroler wysyła przetworzone dane do widoku, a ten wyświetla je klientowi

Kontroler przetwarzając dane, zapisuje je do zmiennych, które przekazywane są widokowi (5). Następnie mamy do czynienia z procesem „opakowywania” danych w kod HTML przez widok i wyświetlania ich klientowi (6) w sposób przez niego ustalony.

Dzięki takiej organizacji aplikacji możemy oddzielić proces pozyskiwania danych od ich przetwarzania oraz wyświetlania – nie mieszamy wszystkiego w jednym pliku (co jest niestety częstym błędem nawet już nieco bardziej opierzonych programistów), tylko mamy wszystko ładnie podzielone – nie musimy przeszukiwać setek linii kodu, który jest odpowiedzialny za wszystko i za nic jednocześnie.

Modele, kontrolery, widoki – gdzie to upchnąć, żeby działało
Każdy framework posiada swoistą strukturę katalogów, która niestety (albo i stety) wymusza na nas zapisywanie konkretnych plików do ściśle określonych miejsc. Z jednej strony jest to ograniczenie (zjadamy tytułowe ciasteczko), a z drugiej godząc się na taki stan rzeczy, otrzymujemy do dyspozycji dobre narzędzie do budowania strony (mamy ciasteczko). Jednocześnie nie istnieje szansa, że pokomplikujemy sobie organizację kodu nadmierną ilością plików rozstawionych w różnych dziwnych miejscach naszej witryny.

Omawiając strukturę katalogów, skupię się tylko na najważniejszych i najczęściej wykorzystywanych zawartych w folderze app:

  • Config – jak nietrudno się domyślić, zawiera wszystkie ustawienia naszej aplikacji. Znajdziemy tam informację na temat ustawień połączenia z baza danych, bezpieczeństwa, domyślnego kontrolera i wiele innych.
  • Controller – to właśnie tutaj będziemy zapisywać wszystkie pliki kontrolerów, jakie przyjdzie nam utworzyć w pracy nad stroną
  • Model – zawiera pliki modelów oraz dodatkowe źródła danych
  • Vendor – mimo iż CakePHP posiada spory zasób klas pomocniczych, które ułatwiają niektóre zadania, to czasem możemy być zmuszeni do wykorzystania dodatkowych klas i bibliotek z po za tego frameworka. By je dołączać do strony musimy zapisać je w tym katalogu
  • webroot – CakePHP przekierowuje zapytania do głównego katalogu strony właśnie na katalog webroot. Jeśli chcielibyście odwołać się np. do pliku www.adres.pl/style.css, powinniście zapisać go właśnie tutaj

Jeśli ktoś z Was jest ciekaw reszty z nich, może się z nimi zapoznać na oficjalnej stronie CakePHP.

No dobrze, ale jak z tego skorzystać? – krótkie ćwiczenie
Myślę, że najlepszym wyjaśnieniem tego jak zacząć korzystać z CakePHP posłuży krótki poradnik jak przygotować dzięki niemu prostą stronę niewykorzystującą bazy danych.

Krok 1: Przygotuj CakePHP do pracy

Gdy już framework znajdzie się na serwerze i wpiszemy adres naszej strony w przeglądarce, naszym oczom ukaże się kilka ważnych informacji. Przede wszystkim, CakePHP poprosi nas o modyfikację dwóch zmiennych: Security.salt oraz Security.cipherSeed. Będą one odpowiedzialne za bezpieczeństwo naszej aplikacji – m.in. za szyfrowanie danych.

security

Możemy je zmodyfikować w app/Config/core.php. Ich wartości są dowolne – jednak powinny być specyficzne dla każdej strony, gdyż działają niczym hasło. W przypadku salt może być to ciąg alfanumeryczny, jednak cipherSeed wymaga ciągu składającego się wyłącznie z cyfr.

Framework poinformuje nas także o wersji PHP wykorzystywanej przez nasz serwer oraz o tym w jaki sposób zapisywany jest cache frameworka, a także sprawdzi, czy posiada uprawnienia do zapisywania danych w katalogu tmp (tam przechowywany jest cache, dane sesji oraz log).

info

Na koniec otrzymujemy informację o tym, że jeszcze nie skonfigurowaliśmy połączenia z bazą danych. W naszym przypadku pominiemy ten krok, gdyż operować będziemy jedynie na warstwach kontrolera oraz widoku, które połączenia z bazą danych nie wymagają.

alert

CakePHP poinformuje nas także o możliwości zainstalowania dodatkowego DebugKit, który umożliwi nam zweryfikowanie dodatkowych danych oraz błędów w naszej instancji frameworka.

Krok 2: Stwórz layout

Layout to dodatkowe „opakowanie” widoku – będzie zawierać stałe elementy strony takie jak znaczniki meta, tytuł strony itd. Wykorzystując odpowiednią metodę określimy w nim miejsce, do którego ma zostać wstawiony nasz widok i zapiszemy go jako app/View/Layouts/antyweb.ctp:

1

Będą z niego korzystać wszystkie podstrony, które utworzymy w ramach naszego wprowadzenia.

Patrząc na rozszerzenie pliku, możemy mieć mieszanie uczucia, ale nie dajcie się zwieść – pliki .ctp w CakePHP są interpretowane tak samo jak zwykłe pliki .php, więc z powodzeniem możemy w nich korzystać z funkcji tego języka.

Krok 3: Przygotuj kontroler dla strony głównej

Domyślnie w CakePHP strona główna jest statyczna i nie potrzebuje dodatkowo definiowanego kontrolera, jednak gdy przyjrzymy się różnego rodzaju witrynom i odpowiemy sobie na pytanie „Ile witryn może mieć statyczną stronę główną?”, dojdziemy do prostego wniosku – osobny kontroler może być nam potrzebny.
By zamienić domyślny kontroler, musimy zmodyfikować plik app/Config/router.php linię:

2

Zmieniamy na:

3

Przechodzimy do utworzenia kontrolera. Będzie on bardzo prosty – posłużymy się tu już starym wyświechtanym „Hello World”. Na początek zdefiniujemy nową klasę HomeController dziedziczącą po klasie Controller, a w niej metodę index odpowiedzialną za domyślną akcję kontrolera:

4

Zapiszemy go w app/Controller/HomeController.php. Zwróćcie uwagę na sposób w jaki nazywamy klasę oraz plik – jest to konwencja odgórnie przyjęta przez CakePHP i nie powinno się od niej odstępować. Jeśli to zrobimy, nasza aplikacja nie będzie działać poprawnie i debuger będzie zwracać błąd.

By nasza akcja kontrolera korzystała z wcześniej otworzonego layoutu, dodamy do niej odpowiednią zmienną oraz przygotujemy zmienną $hello do wyświetlenia w kontrolerze.

Żeby było ciekawiej, dorzucimy jeszcze jakąś tablicę do wyświetlenia:

5

Krok 4: Przygotuj widok dla strony głównej

Skoro już nasz kontroler „przetrawił” odpowiednie dane, pora by widok postarał się je wyświetlić nam w jakiś w miarę przystępny sposób. W tym celu stwórzmy katalog app/View/Home, gdzie zapisywać będziemy wszystkie widoki dla kontrolera HomeController. Do niego trafi plik index.ctp pełniący tą rolę dla akcji index (nazwa pliku widoku musi być taka sama jak nazwa akcji):

6

Krok 5: Sprawdzamy wynik naszej pracy

Jeśli nie popełniliśmy żadnego błędu w naszych plikach, odświeżając stronę powinniśmy uzyskać taki efekt:

wynik

Natomiast kod źródłowy strony będzie wyglądać mniej więcej tak (by kod był czytelniejszy, uporządkowałem tabulatory):

7

Teraz dzięki Dyspozytorowi (Dispatcher), możemy odwoływać się do naszej strony głównej na trzy rożne sposoby:

  • www.adres.pl
  • www.adres.pl/index (adres/kontroler)
  • www.adres.pl/index/index (adres/kontroler/akcja)

Zadanie domowe
Aby poćwiczyć pracę z kontrolerami i widokami, spróbujcie przygotować dodatkową akcję dla HomeController, oraz jej widok. Możecie również przygotować drugi kontroler i na jego bazie ćwiczyć. Zaobserwujcie w jaki sposób możecie się odwoływać do utworzonych w ten sposób podstron. W razie problemów zajrzyjcie do dokumentacji CakePHP lub pytajcie w komentarzach.

Na zakończenie
Starałem się przekazać najistotniejsze informacje potrzebne do podjęcia pracy z CakePHP. Jedni mogą stwierdzić, że zaledwie „polizałem” temat ponieważ na temat tego narzędzia można by napisać książkę, drudzy stwierdzą, że jak dla nich to wystarczająco – wszystko zależy od tego czego kto spodziewał się po tym tekście. Wydaje mi się jednak, że na dobry początek jest to wystarczająca dawka wiedzy, która pozwoli rozpocząć przygodę z CakePHP każdemu, kto jeszcze nie miał z nim do czynienia.

Jeśli istnieją jakieś niejasności lub macie pytania lub uwagi dotyczące tego artykułu – zapraszam do dyskusji. Z chęcią odpowiem na każde z nich w miarę swoich możliwości.

Obrazek główny.