Przedstawienie projektu
Musimy znale藕膰 projekt, nad kt贸rym b臋dziemy pracowa膰. Jest to spore wyzwanie, poniewa偶 musimy znale藕膰 projekt wystarczaj膮co du偶y, aby dok艂adnie om贸wi膰 Symfony, ale jednocze艣nie na tyle ma艂y, aby艣cie si臋 nie znudzili wdra偶aj膮c podobne funkcje wi臋cej ni偶 raz.
Wy艂onienie projektu
Poniewa偶 ksi膮偶ka zostanie opublikowana podczas SymfonyCon Amsterdam, by艂oby fajnie, gdyby nasz projekt w jaki艣 spos贸b by艂 zwi膮zany z Symfony i konferencjami. Co my艣lisz o ksi臋dze go艣ci? Livre d'or, jak m贸wimy po francusku. Odczuwam przyjemn膮 nostalgi臋 tworz膮c ksi臋g臋 go艣ci w 2019 roku!
Trafiony-zatopiony. Projekt b臋dzie polega艂 na zbieraniu informacji na temat konferencji: lista konferencji na stronie g艂贸wnej, osobna strona dla ka偶dej konferencji, mn贸stwo mi艂ych komentarzy. Komentarz sk艂ada si臋 z kr贸tkiego tekstu i opcjonalnego zdj臋cia wykonanego podczas konferencji. Przypuszczam, 偶e w艂a艣nie wypisa艂em ca艂膮 specyfikacj臋, kt贸rej potrzebujemy, aby zacz膮膰.
Projekt b臋dzie zawiera艂 kilka aplikacji. Klasyczna aplikacja internetowa z frontendem w HTML, API i SPA dla telefon贸w kom贸rkowych. Co Ty na to?
Nauka przez praktyk臋
Najlepiej si臋 uczy膰, 膰wicz膮c. Kropka. Czytanie ksi膮偶ki o Symfony jest przyjemne, ale kodowanie aplikacji na w艂asnym komputerze podczas lektury jest o wiele lepsze. Ta ksi膮偶ka jest wyj膮tkowa r贸wnie偶 z innego powodu. Napisa艂em j膮 w taki spos贸b, aby艣 pod膮偶aj膮c przez kolejne rozdzia艂y, osi膮ga艂/a takie same rezultaty, jak ja, kiedy po raz pierwszy kodowa艂em t臋 aplikacj臋.
Ksi膮偶ka zawiera ca艂y kod, kt贸ry musisz napisa膰, i wszystkie polecenia, kt贸re musisz wykona膰, aby uzyska膰 ostateczny projekt. Nie pomin膮艂em 偶adnego kawa艂ka kodu i poda艂em wszystkie polecenia. Jest to mo偶liwe, poniewa偶 nowoczesne aplikacje napisane w Symfony nie wymagaj膮 zbyt du偶o bazowego kodu. Wi臋kszo艣膰 kodu, kt贸ry napiszemy razem, dotyczy logiki biznesowej projektu. Reszta jest w wi臋kszo艣ci zautomatyzowana lub zostanie wygenerowana automatycznie.
Schemat infrastruktury
Nawet je艣li pomys艂 wydaje si臋 prosty, nie zamierzamy budowa膰 projektu w stylu "Hello World". Nie ograniczymy si臋 do PHP i bazy danych.
Celem jest stworzenie projektu, w kt贸rym rozwi膮偶emy niekt贸re problemy, z jakimi spotykasz si臋 w codziennym 偶yciu. Jakie? Przyjrzyj si臋 ko艅cowej infrastrukturze projektu:
Jedn膮 z najwi臋kszych korzy艣ci p艂yn膮cych z zastosowania frameworka jest niewielka ilo艣膰 kodu potrzebna do napisania takiego projektu:
- 20 klas PHP w katalogu
src/
dla aplikacji internetowej; - 550 znacz膮cych linii kodu PHP (ang. Logical Lines of Code, LLOC) zgodnie z danymi wskazanymi przez PHPLOC;
- 40 linii dostosowuj膮cych konfiguracj臋 podzielonych na trzy pliki (przy u偶yciu atrybut贸w i YAML), do skonfigurowania cz臋艣ci backendowej projektu;
- 20 linii konfiguracji infrastruktury lokalnej (Docker);
- 100 linii konfiguracji infrastruktury produkcyjnej (Platform.sh);
- 5 zdefiniowanych zmiennych 艣rodowiskowych.
Czas na wyzwanie!
Sk膮d pobra膰 kod 藕r贸d艂owy projektu?
Trzymaj膮c si臋 stylistyki lat 90., m贸g艂bym stworzy膰 p艂yt臋 CD zawieraj膮c膮 kod 藕r贸d艂owy i Ci j膮 udost臋pni膰, prawda? Zamiast tego staromodnego podej艣cia wykorzystamy jednak repozytorium Git.
Sklonuj (ang. clone) repozytorium ksi臋gi go艣ci na sw贸j komputer:
1
$ symfony new --version=5.4-1 --book guestbook
To repozytorium zawiera ca艂y kod tej ksi膮偶ki.
Zauwa偶, 偶e u偶ywamy symfony new
zamiast git clone
. Polecenie symfony new
robi wi臋cej ni偶 tylko klonowanie repozytorium (hostowanego na GitHubie w ramach organizacji the-fast-track
: https://github.com/the-fast-track/book-5.4-1
). Uruchamia r贸wnie偶 serwer WWW, kontenery, migruje baz臋 danych, uzupe艂nia baz臋 testowymi danymi (ang. fixtures), itp. Po uruchomieniu tego polecenia, strona internetowa powinna by膰 uruchomiona i gotowa do u偶ycia.
Kod z repozytorium jest identyczny z kodem w ksi膮偶ce (u偶yj dok艂adnego adresu URL repozytorium podanego powy偶ej). R臋czne wprowadzanie zmian opisywanych w kolejnych rozdzia艂ach do kodu 藕r贸d艂owego w repozytorium jest prawie niemo偶liwe. Pr贸bowa艂em tego w przesz艂o艣ci, ale nie uda艂o mi si臋. Tak si臋 po prostu nie da. Szczeg贸lnie w przypadku ksi膮偶ek, kt贸re opowiadaj膮 histori臋 tworzenia strony internetowej. Poniewa偶 ka偶dy rozdzia艂 zale偶y od poprzednich, zmiana mo偶e wp艂yn膮膰 na wszystkie kolejne rozdzia艂y.
Dobr膮 wiadomo艣ci膮 jest to, 偶e repozytorium Git dla tej ksi膮偶ki jest nie r臋cznie, lecz automatycznie generowane na podstawie jej zawarto艣ci. Dok艂adnie tak! Lubi臋 wszystko automatyzowa膰, wi臋c istnieje skrypt, kt贸rego zadaniem jest przej艣cie ksi膮偶ki i stworzenie repozytorium Git na jej podstawie. Ma to pewn膮 nieoczekiwan膮 konsekwencj臋: podczas aktualizacji ksi膮偶ki skrypt zawiedzie, je艣li zmiany s膮 niesp贸jne lub je艣li zapomn臋 o zaktualizowniu niekt贸rych instrukcji. To istne BDD - Book Driven Development!
Nawigowanie po kodzie 藕r贸d艂owym
Co wi臋cej, repozytorium to nie tylko ostateczna wersja kodu na ga艂臋zi main
. Skrypt wykonuje instrukcje przedstawione w ksi膮偶ce i zatwierdza zmiany (ang. commit) na ko艅cu ka偶dej sekcji. Dodatkowo ka偶da zmiana w repozytorium jest odpowiednio oznaczona (ang. tag) nazw膮 etapu, kt贸rego dotyczy - co u艂atwi Ci przegl膮danie kodu. 艁adnie, prawda?
Je偶eli chcesz, mo偶esz zobaczy膰 ca艂y kod, jaki powsta艂 w danym etapie, poprzez prze艂膮czenie si臋 (ang. checkout) na odpowiedni znacznik (ang. tag). Na przyk艂ad, je艣li chcesz przeczyta膰 i przetestowa膰 kod na ko艅cu etapu 10, wykonaj nast臋puj膮ce czynno艣ci:
1
$ symfony book:checkout 10
Podobnie jak w przypadku klonowania repozytorium, nie u偶ywamy komendy git checkout
ale symfony book:checkout
. Polecenie to sprawia, 偶e niezale偶nie od stanu, w jakim jest Tw贸j projekt, pliki zmieniaj膮 si臋 do wersji zgodnej z etapem, kt贸ry wskazujesz, a strona jest nadal w pe艂ni funkcjonalna. Uwaga! Wszystkie dotychczasowe dane, kod i kontenery s膮 usuwane w trakcie tej operacji.
Mo偶esz r贸wnie偶 prze艂膮czy膰 si臋 na konkretny podetap:
1
$ symfony book:checkout 10.2
Ponownie, gor膮co polecam samodzielne kodowanie, ale je艣li utkniesz, zawsze mo偶esz por贸wna膰 sw贸j kod z zawartym w ksi膮偶ce.
Nie wiesz, czy Tw贸j kod jest poprawny w podetapie 10.2? Sprawd藕 list臋 zmian (ang. diff):
1 2 3 4
$ git diff step-10-1...step-10-2
# And for the very first substep of a step:
$ git diff step-9...step-10-1
Chcesz wiedzie膰, kiedy plik zosta艂 utworzony lub zmodyfikowany?
1
$ git log -- src/Controller/ConferenceController.php
Mo偶esz r贸wnie偶 przegl膮da膰 listy zmian (ang. diffs), znaczniki (ang. tags) i konkretne zatwierdzenia (ang. commit) bezpo艣rednio na GitHub. Jest to 艣wietny spos贸b na skopiowanie/wklejenie kodu, je艣li czytasz papierow膮 ksi膮偶k臋!