Symfony 1.1 - szybki start

Pierwszy mój artykuł na temat frameworka będzie się tyczył Symfony(wersja 1.1). Jako przykładowa aplikacja nie posłuży nam blog, takowy możemy wykonać na podstawie intruckji ze strony projektu, tudzież z tutoriala na sitepoint. Nasza aplikacją będzie prostą galerią zdjęć, w której będziemy mogli zamiszczać swoje fotki z opisem, dodawać tagi i umożliwić użytkownikowi zostawienie komentarza. Artykuł o Symfony podzieliłem na 4 części:

  • w pierwszym artykule zajmiemy się przygotowaniem środowiska Symfony do pracy wraz z napisaniem schemy bazy danych
  • drugi będzie zabawą generatorem, który pozwoli nam na szybkie stworzenie wygodnego panelu administracyjnego i zabezpieczenie do hasłem
  • w trzecim zajmiemy się frontendem, czyli częścią dla użytkowników
  • czwarty będzie przyjemnością, to znaczy postaramy się "zajaxować" serwis

Na końcu każdego artykułu będzie znajdować się archiwum z "obecnym stanem robót".

Zanim rozpoczniemy

Na wstępie zakładam, że każda z osób, która tu dotarła ma poprawie zainstalowany serwer www wraz php i bazą danych(przykładowa aplikacja będzie pracować na mysql). Muszę napisać, że aby sprawnie pracować i zrozumieć idee Symfony, bedziemy musieli posiadać wiedzę i jakieś doświadczenie z zakresu programowania obiektowego w PHP5. Dokładniej bardzo często spotkamy statyczne metody, właściwości oraz dziedziczenie, które w dużej mierze jest podstawą frameworka. Jeżeli wyżej wymienione terminy tobie nic nie mówią, odsyłam ciebie do swoich artykułów na temat programowania obiektowego, które możesz znaleźć tu - programowanie obiektowe.

Środowisko w którym będe pisał przykładową aplikacje to:
Fedora Core 8 z serwerem Apache 2.2.9, PHP 5.2.6 oraz MySQL 5.0

Wywoływane komendy będa w środowisku Linux, aby działało to na systemie Windows musimy mieć poprawnie skonfigurowaną zmienną systemową Path, jeśli tego nie chcemy zmieniać, musimy podawać pełna ścieżkę do pliku php-cli.

Instalacja

Symfony występuje w dwóch wersjach do pobrania(pomijam svn, zaawansowani użytkownicy mogą próbować w ten sposób pobierać frameworka). Pierwszą jest kanał pear, który tu opisze oraz tzw. sandboxa. Sandbox jest to pusty projekt, który zawiera w sobie wszystkie niezbędne biblioteki do działania. Domyślnie jest skonfigurowany dla sqlite. Jeżeli decydujesz się na tą wersje to możesz ją pobrać z adresu http://www.symfony-project.org/get/sf_sandbox_1_1.zip i od razu przejść do części "konfiguracja hosta wirtualnego". Minimalne wymagania to na pewno PHP5, baza danych wg uznania.
Podczas instalacji Symfony, zawsze korzystam z paczki pear, która daje mi tą wygode, że nie musze trzymać wielu zduplikowanych plików, jak w przypadku Sandbox'a.
Zaczynamy najpierw od dodania kanału pear:

pear channel-discover pear.symfony-project.com

Następnym krokiem będzie instalacja samego Symfony, bierzącą wersją jest 1.1.1, więc wykonamy to komendą pear:
pear install symfony/symfony-1.1.1

Niektóre dystrybucje takie jak np. Debian/Ubuntu, posiadają gotowe paczki do instalacji w swoich repozytoriach. Niestety Fedora nie posiada takich udogodnień.

Utworznie pustego projektu Symfony

Kiedy wszystko już zainstalowaliśmy musimy utworzyć pusty projekt aby móc skonfigurować wirtualnego hosta. Zaczynamy tworzyć pusty projekt, pierwszą rzeczą jaką musimy zrobić jest wybranie ścieżki w moim wypadku będzie to /var/webs/galeria. Przechodzimy do tego katalogu i w celu utworzenia projektu wykorzystujemy standardowo dołączony do frameworka generator o nazwie symfony.

symfony generate:project galeria

Generator ów utworzy nam podstawowe katalogi i pliki niezbędne do działania środowiska, przy okazji ustawiając nam niezbędne prawa dostępu do plików/katalogów, bowiem w sandboxie musimy sami ustawić prawa zapisu dla katalogów cache oraz log. Najważniejszym katalogiem dla nas będzie katalog web, z którego odpalane są aplikacje i który będzie nam potrzebny do konfiguracji vhosta. Standardowo tam nie znajduje się katalog sf, w którym znajdują się domyślne pliki grafik, style i pliki javascript. Musimy je dograć sami, katalog sf znajduje się w sandboxie w katalogu web, więc wystarczy tylko rozpakować z "piaskownicy"(ang. sandbox) katalog sf i skopiować do naszego web.

Konfiguracja wirtualnego hosta

Jeżeli strone umieściliśmy w katalogu z którego domyślnie serwer Apache wczytuje serwisy wystarczy w pliku httpd.conf odszukać zmienną DocumentRoot i dopisać do niej katalog web, z którego domyślnie startuje nasza aplikacja. Jeśli zaś chcemy tak jak ja aby nasz projekt był obsługiwany przez np. subdomenę, jak w moim wypadku http://galeria.mephir.net.pl , mysimy skonfigurować poprawnie vhosta. Pierwszą rzeczą jakiej musimy dopilnować jest to aby przed definicją wirtualnego hosta była zmienna NameVirtualServer. U mnie wygląda ona tak:

NameVirtualHost 91.121.144.23:80

Jeżeli mamy ją wpisaną poprawnie, możemy przejść do utworzenia vhosta. U mnie wpis ten wygląda następująco:
#galeria.mephir.net.pl vhost
<VirtualHost 91.121.144.23:80>
    ServerName galeria.mephir.net.pl
    DocumentRoot "/var/webs/galeria/web"
    DirectoryIndex index.php
    <Directory /var/webs/galeria/web>
        Options All
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Aby zadziałało to u was, trzeba dostosować ustawienia zmiennej DocumentRoot oraz tagu Directory do własnych ścieżek. Pod wyżej wymienionym vhostem czyli adresem http://galeria.mephir.net.pl będzie można prześledzić działanie całego projektu, wraz z trybem developerskim. Po zmianie konfiguracji serwera musimy oczywiście przeładować go lub zrestartować. Obecnie jeżeli wpiszemy nasz adres efektem będzie wyświetlenie komunikatu że nie znaleziono strony.

Tworzenie aplikacji

W naszym przykładzie w projekcie utworzymy dwie aplikacjie frontend, która będzie widoczna dla naszych gości oraz backend, która będzie naszym panelem administracyjnym. Aby utworzyć wyżej wymienione aplikacje musimy znowu skorzystać z generatora symfony. Przechodzimy więc go katalogu głównego projektu i wpisujemy dwie komendy:

symfony generate:app frontend
symfony generate:app backend

Sandbox ma domyślnie utworzoną aplikacje frontend, dlatego też wykonujemy tylko drugą komende!

Utworzą one nam podstawową strukture dla aplikacji frontend i backend. Jeżeli wejdziemy do katalogu apps/ zobaczymy, że pojawiły sie tam dwa nowe katalogi o nazwach naszych aplikacji. Teraz możemy wejść na naszą strone i jeżeli wszystkie operacje sie powiodły powinniśmy ujrzeć taki ekran:
Symfony Project Created

Konfiguracja bazy danych

Na wstępie powiem trochę o samych plikach konfiguracyjnych, większość plików konfiguracyjnych jest w formacie yaml. Format ten pozwala w łatwy i szybki sposób przekształcić nam plik w tablice asocjacyjną. Jedną z głównych rzeczy, o której musimy pamiętać korzystając z yaml to, że nie wolno w nich używać znaków tabulacji, wcięcia robi się za pomocą spacji, reszte zobaczymy już na przykładach. Dla osób korzystających z edytora Eclipse polecam plugin, który ułatwia prace z plikami yml, między innymi pilnując wcięć, dostepny jest on pod adresem http://www.noy.cc/symfoclipse/ . Teraz przechodzimy już do konfiguracji bazy musimy to zrobić w dwóch plikach z katalogu config, który znajduje się w głównym folderze projektu. Pliki te to databases.yml oraz propel.ini. Jeżeli otworzymy pierwszy z nich zauważymy, że całość jest zakomentowana("#" oznacza komentarz w plikach yaml). W wersji pear wygląda on tak:

#all:
#  propel:
#    class:          sfPropelDatabase
#    param:
#      dsn:          mysql://root@localhost/dbname

Musimy odkomentować wszystkie linie i wpisac własne parametry połączenia do bazy. Przykładowo:
all:
  propel:
    class:          sfPropelDatabase
    param:
      dsn:          mysql://nazwa_uzytkownika:haslo@adres_serwera_baz/nazwa_bazydanych

W moim wypadku dsn wygląda następująco mysql://galeria:haslo@localhost/galeria_db
Zajmijmy się teraz konfiguracją bazy danych dla serca Symfony czyli Propela. Otwieramy drugi plik, czyli propel.ini i szukamy podobnych lini:
propel.database.createUrl  = mysql://root@localhost/
propel.database.url        = mysql://root@localhost/galeria

Zmieniamy parametry połączenia na nasze, u mnie wyglądaja one nastepująco:
propel.database.createUrl  = mysql://galeria:haslo@localhost/
propel.database.url        = mysql://galeria:haslo@localhost/galeria_db

Ostatnią czynnością będzie wyczyszczenie cache. Zrobimy to wywołując komende
symfony cc

w katalogu głównym projektu.

Schema i budowanie bazy danych

Aby móc w pełni korzystać z dobrodziejstw Symfony musimy mu podać scheme bazy danych. Robimy to w pliku schema.yml znajdującym sie w tym samym katalogu co pliki konfiguracyjne bazy. Jeżeli go otworzymy zobaczymy, że jest pusty, więc musimy do niego dodać nastepującą treść:

propel:
  photo:
    _attributes: { phpName: Photo }
    id:          ~
    photo_path:  varchar(100)
    mini_path:   varchar(100)
    opis:        longvarchar
    created_at:  ~
    updated_at:  ~
  tag:
    _attributes: { phpName: Tag }
    photo_id:    ~
    name:        varchar(50)
  comment:
    _attributes: { phpName: Comment }
    photo_id:    ~
    tekst:       longvarchar
    autor:       varchar(100)
    email:       varchar(255)
    created_at:  ~

Scheme można pisać w dwóch formatach yaml oraz xml, ja wole od yml ponieważ, dużo wygodniej pracuje się później na modelach. Tworzeniu schemy, możnaby poświecić cały artykuł, co nie wątpliwe zrobie, opisze teraz tylko po krótce "co z czym się je". Pierwsze linijka określa nam baze danych. Każdy element wpisany w odstępie dwóch spacji to nazwa tabeli, która ma przyporządkowany atrybut phpName oraz opisane pola. Osoby, które miały styczność z bazami danych na pewno widzą podobienśtwa w typach pól np. varchar(100), oznacza on to samo co w sql czyli kolumne o zmiennej długości znaków o maksymalnym rozmiarze 100. Różnice można zauważyć w typach longvarchar oraz ~. Pierwszy z racji iż Symfony obsługuje kilkanascie rodzajów baz danych zastępuje mysql'owe pole typu text. Tylda("~") natomiast, pozwala generatorowi na dobór pola względem nazwy. Jak to działa? Trzymając sie pewnej systematyki nazewnictwa pól zaoszczędzamy bardzo dużo czasu a mianowicie każde pole o nazwie id z typem ~ zostanie zapisane automatycznie jako klucz główny(primary key), z auto_increment oraz typie integer i długości 11. Pola o nazwach created_at oraz updated_at, będą miały typ datetime oraz created_at bedzie uzupełniane podczas dodawania rekordu, a updated_at podczas dokonywania zmian w rekordzie. Spojrzmy jeszcze w photo_id: ~ jeżeli nazwe pola wpiszemy nazwatabeli_id i jako typ ustawimy tylde wtedy automatycznie zostanie nam stworzony klucz obcy(ForeignKey) do pola "id" w tabeli "nazwatabeli". Musimy pamiętać, że Symfony, a dokładniej Propel działa na tabelach InnoDB. Do opisu został ostatni element _attributes, który pozwala nam na definicje atrybutów dla tabel. phpName określa np. nazwe modelu.
Ostatnią czynnością, którą wykonamy jest utworzenie bazy danych na podstawie schemy. Wykonamy to komendą:
symfony propel:build-all

Po tej operacji musimy wyczyścić cache. Utworzenie bazy możemy sprawdzić np. korzystając z phpMyAdmin. Sukces w wykonaniu oświadczy nam nastepujący komunikat:
BUILD FINISHED

Total time: 0.1941 seconds

Pliki zamiesczone w archiwum są wzrutem z serwera z wersji instalowanej za pomocą pear! Aby moje zmiany zadziałały w sandboxie wystarczy rozpakować archiwum do katalogu głównego projektu i wyczyścić cache.
Nie zapomnij zmienić konfiguracji bazy na swoją!

ZałącznikWielkość
galeria-0.1.1.zip284.5 KB
Your rating: Brak Ocena: 5 (2 votes)

yaml to to, że nie wolnow

yaml to to, że nie wolnow nich "wolno w nich"
reszte zobaczymy na przykładach już. "już na przykładach"
nazewnictwa pół zaoszczędzamy "pól"

Dzięki!

Dzięki Marcin ...

nareszcie mi to zagrało

dziękuję.

witam

hej Marcin,
gdzie można znaleźć następne części??

Fabio

Dodaj nową odpowiedź

Zawartość pola nie będzie udostępniana publicznie.
  • Adresy internetowe są automatycznie zamieniane w odnośniki, które można kliknąć.
  • Dozwolone znaczniki HTML: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Znaki końca linii i akapitu dodawane są automatycznie.
  • You can use the <go> tags just like the <a> for nicer urls.

Więcej informacji na temat formatowania