czwartek, 15 stycznia 2009

Symfony - dzień drugi

Opisujemy strukturę bazy danych w pliku config/schema.yml
Następnie tworzymy bazę: mysqladmin -uroot -pmYsEcret create jobeet

Wywołujemy polecenie:
php symfony configure:database "mysql:host=localhost;dbname=jobeet" root mYsEcret
które tak na prawdę zapisuje informacje o dostępie do bazy w pliku config/databases.yml co możemy wszak wykonać ręcznie :)

Wykonujemy polecenie: php symfony propel:build-sql
które przygotowuje dla nas skrypty SQL tworzące strukturę naszej bazy danych. Wyniki przechowywane w katalogu data/sql/ - tutaj data/sql/lib.model.schema.sql

Ostatecznie wywołujemy: php symfony propel:insert-sql
które tworzy naszą bazę danych. Należy uważać (choć jest stosowny alert) - wykonanie tego polecenia usuwa dotychczasowe tabele.

Na marginesie: opis polecenia uzyskamy przez zastowanie parametru help np. php symfony help propel:insert-sql

Generujemy klasy PHP mapujące naszą relacyjną bazę danych na obiekty: php symfony propel:build-model
W wyniku powyższego w katalogu lib/model/ tworzone są skrypty zawierające po cztery klasy na każdą z tabel naszej bazy danych.
Np. dla tabeli jobeet_job:
- JobeetJob - obiekt tej klasy to pojedyńczy rekord tabeli
- BaseJobeetJob - klasa z której dziedziczy klasa JobeetJob. Za każdym wywołaniem propel:build-model klasa ta jest nadpisywana, więc wszystkie modyfikacje muszą znajdować się w ramach JobeetJob
- JobeetJobPeer - klasa zawierająca statyczne metody zwracające kolekcje rekordów
- BaseJobeetJobPeer - analogicznie dla klasy BaseJobeetJob

Edycja kolumn dla rekordów odbywa się poprzez wywoływanie metod get/set:
$job = new JobeetJob();
$job->setPosition('Web developer');
$job->save();
echo $job->getPosition();
$job->delete();

Definiowanie kluczy obcych (złączeń?) odbywa się poprzez linkowanie obiektów:
$category = new JobeetCategory();
$category->setName('Programming');
$job = new JobeetJob();
$job->setCategory($category);

Wracając do głównego wątku, dwa powyższe kroki oraz inne użyteczne wyniki można uzyskać prościej i bez konieczności potwierdzenia poprzez:
php symfony propel:build-all --no-confirmation

Jedną z zalet Symfony jest ponoć brak konieczności korzystania z instrukcji require / include. Koszt jaki trzeba za to udogodnienie ponieść jest niewielki, ale trzeba pamiętać że za każdym razem gdy dodamy nową klasę należy wyczyścić cache frameworka. Ponieważ wygenerowaliśmy sporo klas, wykonajmy:

php symfony cache:clear
lub w skrócie:
php symfony cc

Potrzebujemy jeszcze wstępnie wypełnionych tabel. Do tego celu możemy zastosować "skrypty" YAML umieszczane w katalogu data/fixtures/ oraz zadanie propel:data-load

Kiedy potworzymy już odpowiednie pliki wywołujemy: php symfony propel:data-load

Ewentualni zakładamy combo: propel:build-all-load wykonuje nam akcje propel:build-all oraz propel:data-load

Podział obowiązujący w ramach naszego dzieła: projekt -> aplikacje -> moduły
gdzie moduł to zestaw kodu PHP realizujący jakieś pojedyńcze zadanie np. zestaw operacji jakie użytkownik może wykonać na obiekcie reprezentującym zestaw danych z bazy.

Poznawany framework potrafi automatycznie generować moduły umożliwiające podstawowe operacje na danych z bazy w ramach wskazanego modelu:

php symfony propel:generate-module --with-show --non-verbose-templates frontend job JobeetJob

Powyższe utworzyło moduł job w ramach aplikacji frontend application dla modelu danych JobeetJob. W katalogu apps/frontend/modules/job/ utworzone zostały podkatalogi: actions/ oraz templates/

Plik actions/actions.class.php zawiera definicje wszystkich możliwych akcji dla modułu job:

index wyświetla rekordy tabeli
show wyświetla pola i ich wartości dla wskazanego rekordu
new wyświetla formularz do założenia nowego rekordu
create tworzy nowy rekord
edit wyświetla formularz do edycji istniejącego rekordu
update aktualizuje rekord w oparciu o wprowadzone dane
delete usuwa rekord z bazy

W dosłownym tłumaczeniu (zrozumienie zostawiam sobie na później):

Symfony potrzebuje tekstowej reprezentacji kategorii. Reprezentacja obiektu PHP jest definiowana przy pomocy metody magicznej__toString() i powinna być zdefiniowana dla każdej klasy modelu np. dla JobeetCategory:

// lib/model/JobeetCategory.php
class JobeetCategory extends BaseJobeetCategory
{
public function __toString()
{
return $this->getName();
}
}

Brak komentarzy:

Prześlij komentarz

Archiwum bloga