$this->post(’wstęp do symfon(y)ii’);
Każdy programista dochodzi to takiego momentu w swoim życiu, że zaczyna zdawać sobie sprawę, że tak naprawdę jego praca polega na powtarzaniu czynności kopiuj/wklej z jednego projektu do drugiego. Potem drobna modyfikacja i działa. Po pary takich przypadkach, programista zaczyna się zastanawiać nad tym iż może uda mu się zautomatyzować kilka procesów takich jak np. podłączanie do bazy, generowanie formularzy, weryfikacja wprowadzanych danych itp. Tak powstaje framework. Po pewnym czasie samo projektowanie frameworka daje programiście więcej przyjemności niźli robienie innych czynności. Każdy z takich programistów ma frameworka dostosowanego do swoich potrzeb, nazwanego tak jak chce i spełniającego wymyślone przez samego siebie zasady…
Nastepnym krokiem jest szukanie czy ktoś przypadkiem przed nim nie odkrył koła :). Następuje przeglądanie istniejących rozwiązań, później narzekanie że za mały, że ma nie tak nazwane funkcje, że dziwnie działa, że nie da się na tym pracować. Każde z tych narzekań spowodowane jest tym iż w innych projektach tak naprawdę to my MUSIMY się przystosować a to czasem bywa bolesne lub po prostu nie jest tak naprawdę potrzebne. Ale czasem przychodzi taki moment że tak naprawdę zdajemy sobie sprawę że nasz framework jest ciekawy, spełnia nasze oczekiwania ale niestety nie jest doskowały i ciągle coś nam w nim brakuje. Czas spędzony na stworzenie go oczywiście nie jest czasem straconym ponieważ zyskane doświadczenie procentuje w innych projektach ale jeżeli pomyśleć, że ten sam czas można by poświęcić na poznanie czegoś nad czym pracuje rzesza programistów i ma ciekawsze rozwiązania to niestety łapiemy się za głowę i myslimy “czemu nie można było tak od razu”…. Tak więc właśnie ja jestem na tym etapie…. czemu… :)
Generalnie w momencie zdania sobie sprawy z możliwości innych framework’ów zaczynamy szukać co by nam odpowiadało. Nie jest to proste ponieważ ile osób się spyta to tyle się dostaje odpowiedzi. Mój wybór akurat padł na Symfony pod wpływem użytkowników forum.php.pl (nieświadomym oczywiście :) ). Dlaczego nie Zend czy Agavi czy chociaż rozwijany nasz Rapide ? Ano wybór miałem prosty ponieważ potrzebuje narzędzia które po pierwsze będzie stabilne (symfony właśnie wydał wersję 1.0 co też nie było bez znaczenia), będzie szybkie, dobrze udokumentowane no i to na czym najbardziej mi zależy: dobrze by było gdyby posiadało generator klas/zapytań do SQL. Symfony to ma i co najważniejsze, to tak naprawdę po wstępnym zainstalowaniu i przeczytaniu pierwszych pięciu roździałów z książki o Symfony jestem z wyboru bardzo zadowolony. Postanowiłem w związku z tym dzielić się na bieżąco moimi doświadczeniami. A ponieważ nie znalazłem tekstów w internecie traktujących o Symfony w naszym rodzimym języku postanowiłem również to wziąć pod uwagę i dać innym możliwość nauki na “cudzych błędach”. Oczywiście proszę pamietać że tak naprawdę pisząc to wszystko tak naprawdę utrwalam sobie dopiero wiedzę. Tak więc jeżeli znajdziecie w tekście błędy to proszę o kontakt. Tyle słowem wstępu do wstępu… przejdźmy do tego co tygryski lubią najbardziej….
Instalacja
Instalacja jest w miarę prosta. Jednak trzeba pamiętać o tym iż tak naprawdę w framework’u tylko część powinna być widoczna dla użytkowników odwiedzających nasz serwis. W związku z tym potrzeban będzie odpowiednia konfiguracja web serwera (opiszę przykład z apache’a ponieważ akurat takowego posiadam).
Posiadaczem Symfony można stać się na kilka sposobów. Jednym z nich jest ściągnięcie archiwum spakowanego z internetu np. stąd. Innym sposobem jest pobranie poprzez SVN lub PEAR (szczegółowy opis na stroei projektu) ale ja wybrałem taką metodę, która da mi możliwość pełnej kontroli nad tym co robie :). Tak więc archiwum możemy sobie rozpakować w dowolnie wybranym katalogu. Ja sobie zrobiłem np. /var/wwwSymfony/ (strony serwowane przez apache’a są w /var/www/) i tam przekopiowałem całość znajdującą się w rozpakowanym folderze ’symfony_1.0.0′. Zapomiałem dodać iż do tej całej zabawy należy mieć PHP jako CLI. Daje to możliwość generowania gotowych struktur wymaganych przez FW no i zmiejsza ból głowy początkującego :). Poprawność instalacji FW można sprawdzić wydając polecenie:
myHost$ php /var/wwwSymfony/data/bin/symfony -V
Jeżeli w wyniku dostaniemy ’symfony version 1.0.0′ to znaczy że można czytać dalej.Mój pierwszy projekt
Na wstepnie trzeba rozgraniczyć iż Symfony rozgranicza podział na:
- projekt
- aplikację
- moduły
Projekt to nasza główna ‘baza’ do zabawy. Aby stworzyć nowy projekt trzeba utworzyć nowy katalog w ktorym będą wszystkie pliki projektu. Ja wyszedłem z założenia iż jeżeli mam ‘na serio’ używać tego to najlepiej jest zrobić docelową strukturę od samego początku. Tak więc w katalogu /var/wwwSymfony/ pojawił się podkatalog ‘projekty’ a w nim ‘helloWorld’ czyli pierwszy projekt którego nazwę trzeba sobie po prostu wymyśleć. Nastepnie trzeba ‘wejść’ do katalogu naszego pierwszego projektu ponieważ to w nim ma się pojawić struktura naszego projektu. Kolejnym krokiem jest wygenerowanie odpowiedniej struktury poleceniem:
myHost$ php /var/wwwSymfony/data/bin/symfony init-project helloWorldProject
Objaśniając: wywołujemy skrypt symfony z odpowiedniego katalogu z dwoma parametrami. Pierwszym jest polecenie dla generatora/skryptu ‘init-project’ - czyli po prostu inicjalizacja projektu. Drugim parametrem jest nazwa projektu (nie ma ona nic wspólnego z nazwą katalogu w którym się znajduje projekt - tak jakby ktoś pytał). Tą nazwą będziemy posługiwali się podczas tworzenia innych części naszego projektu. Po wykonaniu tego polecenia stworzy nam się domyślna struktura plików i katalogów z których tak naprawdę tylko katalog ‘web’ udostępniamy szerszemu gronu odbiorców. Zrobić to można poprzez odpowiednie dyrektywy w plikach konfiguracyjnych apache’a (niestety dla użytkowników innych serwerów nie przygotuję wersji). Przykład takiej konfiguracji:
<VirtualHost *:80>
ServerName hello.localhost
DocumentRoot “/var/wwwSymfony/projekty/helloWorldProject/web”
DirectoryIndex index.php
Alias /sf /var/wwwSymfony/data/web/sf
<Directory “/var/wwwSymfony/web/sf”>
AllowOverride All
Allow from All
</Directory>
<Directory “/var/wwwSymfony/projekty/helloWorldProject/web”>
AllowOverride All
Allow from All
</Directory>
</VirtualHost>
Kolejnym krokiem jest inicjalizacja aplikacji których to w projekcie naszym możemy mieć kilka (nalepszym przykładem jest osobna aplikacja do wyświetlania zawartości bazy danych i osobna do administrowania danymi). Inicjację aplikacji tworzymy również będąc w katalogu projektu a czynimy to poleceniem:
myHost$ ./symfony init-app showApp
Oczywiście showApp w przykładzie to nazwa naszej aplikacji. Struktura naszej aplikacji stworzyła się w podkatalogu ‘apps’ naszego projektu. Oczywiście nazwą katalogu jest nazwa aplikacji tak dla zmyłki :). Po tej nazwie identyfikujemy naszą aplikację więc warto ją zapamiętać lub chociaż pamiętać gdzie możemy ją znaleść. Już w tym momencie możemy zobaczyć jak wygląda nasza aplikacja. Symfony daje taką możliwość gdyż jak widzieliśmy we fragmencie konfiguracji apache’a udostepniamy nie tylko katalog naszej aplikacja ale również fragment katalogu samego FW. Chwilowo odchodząc od tematu warto wspomnieć iż sam framework po inicjalizacji daje nam możliwość śledzenia całego procesu działania naszej aplikacji poprzez utworzenie dla nas wersji ‘dev’ naszej aplikacji czyli wersji deweloperskiej. Wersji oczywiście można sobie tworzyć więcej i co najlepsze w tej całej zabawie to każdą z nich możemy osobno konfigurować, zmieniać wygląd czy samo zachowanie. Do wersji developerskiej odnosimy się poprzez adres <nazwaAplikacji>_dev.php/. Co do szczegółów ‘wersjonowania’ aplikacji to zapraszam do książki lub dokumentacji ponieważ jak już napisałem na wstępie niniejszy tekst jest zapiskiem mojej walki z poznaniem tego frameworka.
Generalnie to wszystko mamy gotowe do wyświetlenia. Ale czemu, spytacie, skoro jak na razie do tej pory nie stworzyliście ani jednej linijki kodu ? Ano właśnie dlatego że ten FW daje nam taki mozliwości. Ma wspomagać w szybkim tworzeniu aplikacji i wspomaga :). Ale wracając do tematu. Teraz dobrze by było coś zaprogramować, prawda ? Zgodnie z tym co zrozumiałem z książki, symfony oferuje nam coś takiego jak moduły. Moduły odpowiadają za działanie fragmentów aplikacji. Każdy z nich uruchamiamy poprzez URL (w domyslnej postaci) http://hello.localhost/index.php/<modul>/<akcja>. Oczywiście w miejsce <moduł> wstawiamy nazwę modułu a w miejsce <akcja> nazwę metody (moduł == klasa) danego modułu. Ale jak swtorzyć moduł ? W książce napisali, że można ręcznie się bawić ale po co skoro dali nam taki ciekawy generator. Tak więc tworzymy moduł poleceniem:
myHost$ ./symfony init-module mojModul
Zauważyliście że nie użyłem składni : php /var/cośtam….. ? A to dlatego że podczas inicjalizacji projektu, FW tworzy kopie pliku uruchamiającego wszystkie akcje w głownej ścieżce projektu i zmienia my atrybuty na uruchamialny (znaczy +x). Małe ułatwienie a mocno cieszy iż ktoś jednak o nas myśli. Ale po raz kolejny wracając do tematu. Po inicjacji naszego modułu, mamy stworzoną oczywiście strukturę modułu w katalogu naszProjekt/apps/naszaAplikacja/modules/naszModul/. W każdym module mamy katalog ‘actions’ oraz ‘templates’. Do wstępu powinno wystarczyć. W katalogu ‘actions’ jest wygenerowany plik ‘actions.class.php’ w którym znajduje się domyślnie jedna akcja (jako default ustawiony jest forward na tymczasową stronę symfony - co można zmienić w plikach konfiguracyjnych ale o nich to napisze w innym terminie :)). Każda z akcji musi mieć zachowaną zasadę co do nazewnictwa. Jeżeli chcemy mieć w adresie odwołanie typu http://hello.localhost/mojModul/zobacz to nazwa metody musi mieć postać executeZobacz(). Zasada tworzenia nowych akcji/metod i nadawania im nazw jest prosta. Każda nazwa akcji zaczyna się od słowa ‘execute’ po którym następuje właściwa nazwa akcji tylko Z DUŻEJ litery. I o tym należy pamiętać. Natomiast w katalogu ‘templates’ znajdują się szablony oparte o proste funkcje php + helpery z symfony. I tu też obowiązuje nas zasada co do nazewnictwa. Każdy z szablonow dla konkretnej akcji musi mieć nazwę skladającą się z nazwy akcji oraz zwracanego rezultatu akcji. Dla przykładu: szablon o nazwie indexSuccess.php będzie wywołany w momecie kiedy metoda executeIndex() klasy danego modułu zwróci wartość sfView::SUCCESS (domyślnie zwracana wartość tak więc za każdym razem nie musimy jej wpisywać). Jeżeli ta sama metoda zwróci wartość sfView::ERROR to nazwa szablony dla niej będzie indexError.php Inne zwracane wartości podane są w manualu.
Teraz przystąpimy do prostego kodowania aby zobaczyć na czym cła zabawa polega. Wracając do katalogu naszego pierwszego modułu czyli przypominając: /var/wwwSymfony/projekty/helloWorldProject/apps/showApp/modules/mojModul/ musimy wyedytować plik ‘actions/actions.class.php’. Nastepnie w metodzie executeIndex() (co jest domyślną metodą wywoływaną jeżeli jawnie nie zdecydujemy którą wywołać) usuwamy forwardowanie do tymczasowej strony generowanej przez Symfony i wpisujemy np: $this->mojaZmienna = ‘hello World from Symfony FW’; Teraz przechodzimy do edycji pliku indexSuccess.php w katalogu szablonów i w nim wpisujemy <?php echo $mojaZmienna; ?>. Po wejsciu na stronę http://hello.locahost/mojModul/ powinna pokazać się nam zawartość wpisanej zmiennej.
Summary czyli podsumowanie
Jak widać samo czytanie tak naprawdę zajeło nam więcej czasu niż stworzenie kodu. Generalnie jak widać potrzebowalismy kilku poleceń do wygenerowania odpowiednich struktur oraz wiedzy gdzie i co trzeba wyedytować aby zobaczyć jak działa FW działa. Jak już wspomniałem na ‘dzień dobry’ mamy możliwość sprawdzenia tak naprawde co się dzieje z naszą aplikacją w framework’u dzięki stronie ‘nazwaAplikacji_dev.php’. Jeżeli nas to nie zadowala to mamy domyślnie logowane wszystkie działania na aplikacji w pliku logów znajdującym się w podkatalogu ‘logs’ na głównej ścieżce projektu. Co do innych możliwości symfony to muszę przyznać że jestem pod wrażeniem ale o tym albo przeczytacie później albo po angielsku :)
Co do odczuć to sami musicie dojść do tego czy warto ‘przegryzać’ się przez dokumentację angielskojęzyczną dla kilku linijek kodu mniej. Ja uważam że warto. Po tym co udało mi się dzisiaj zrobić ( o tym w następnych relacjach - powiem tyle że wygenerowanie klas obsługujących zapytania do bazy, które robią z nią wszystko to 10 minut :) ), uważam że dostajemy naprawdę dobre narzędzie całkowicie za darmo i ze wsparciem ze strony autorów oraz z potężnymi możliwościami konfiguracyjnymi.
Ja jestem zachwycony….
PS. Wyszła nowa wersja huacasa - 0.5.0 z sortowaniem. Udostępnię ją pod tym samym adresem gdzie byłą poprzednia :) Do zrobienia zostają katalogi chronione hasłami i jeszczę parę pierdółek… Ale chwilowo zachwycam się symfonią więc zmiany będą musiały poczekać.
PS2. Jeżeli coś jest niezrozumiałe to pomimo jak na razie skąpej wiedzy o tym framework’u proszę o kontakt a postaram się pomóc w rozwiązaniu problemu.
About this entry
You’re currently reading “$this->post(’wstęp do symfon(y)ii’);,” an entry on arecki’s
- Published:
- 26.02.07 / 12przed południem
- Category:
- symfony
4 Comments
Jump to comment form | comments rss [?] | trackback uri [?]