Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

Propel, czyli wydajna i wygodna obsługa baz danych w PHP5

Rozszerzanie wygenerowanych klas

Jeśli dokładniej przyjrzymy się plikom generowanym przez Propel-generator (Rysunek 4 i 5), zauważymy, że klasy utworzone w głównym folderze są praktycznie puste - rozszerzają tylko właściwe klasy umieszczone w podkatalogu om. Te szkielety są specjalnie przygotowane na zmianę i rozszerzenie standardowej funkcjonalności.

Na początku przyjrzyjmy się klasie o nazwie [NazwaTabeli], np. Book. Rozszerza ona klasę BaseBook i koncepcyjnie odpowiada danym i operacjom na pojedynczym rekordzie tabeli w DB. Jest to doskonałe miejsce, by dodać zachowanie specyficzne dla obiektu biznesowego. Załóżmy, że w naszym hipotetycznym sklepie czas wysłania produktu jest wyliczany na podstawie skomplikowanego algorytmu, biorącego pod uwagę jego stan magazynowy w sklepie, u hurtownika i informacje o wyczerpaniu nakładu. Metoda podająca czas dostawy operowałaby tylko na polach klasy Book. Dodanie nowej metody getShippingDate() w klasie Book jest idealnym rozwiązaniem przedstawionego problemu. Warto też pamiętać o jednej ze standardowych metod: [NazwaTabeli]Base::hydrate(ResultSet $rs). Odpowiada ona za wypełnienie stworzonego obiektu danymi z DB i jest idealnym miejscem do uzupełnienia wszystkich pól wyliczeniowych, które mogą pojawić się w obiekcie (nie możemy tego zrobić w konstruktorze, ponieważ ten ostatni jest wołany przez Propela, jeszcze przed uzupełnieniem pól obiektu).

Inne zastosowanie zmian w omawianej klasie to wykonywanie ustalonych czynności przy modyfikacji danych. Trzymając się naszego przykładu ze sklepem internetowym załóżmy, że po dodaniu nowego produktu chcemy wysłać e-mail do tłumacza, z prośbą o przygotowanie opisów w innych wersjach językowych. Dzięki klasie Base[NazwaTabeli] dysponujemy jednym, centralnym miejscem w kodzie, gdzie wykonywane są operacje zapisu do DB metodą doSave(). Przykład jej nadpisania przedstawiamy na Listingu 7.

Klasa [NazwaTabeli]Peer, rozszerzająca Base[NazwaTabeli]Peer zawiera głównie metody statyczne związane z pobieraniem i zapisem danych. Wydaje się, że w praktyce będzie ona zmieniana głównie w celu dodania metod wyszukujących dane. Jeśli w naszej aplikacji powtarzają się zapytania o obiekty spełniające określone kryteria (np. pobieranie listy tylko dostępnych w danym momencie książek), warto zapisać to zapytanie w postaci statycznej metody w klasie [NazwaTabeli]Peer. Metody takie zwykle nazywa się od ang. findBy[NazwaWarunku], a ich zadaniem jest opakowanie konkretnego (być może parametryzowanego) zapytania, wyrażonego w Criteria API lub SQL. Takie metody, zwracające listę wyników nie tylko oszczędzają nam wysiłku pisania takich samych zapytań, ale pozwalają również zmienić warunki wyszukiwania bez naruszania pozostałych części aplikacji.

Rysunek 3. Od pliku XML do działającej aplikacji

Listing 4. Zapis, aktualizacja i kasowanie danych

Propel::init(dirname(__FILE__).'/conf/bookstore-conf.php');
include_once 'bookstore/Publisher.php';
$pub = new Publisher();
$pub->setName("Wydawnictwo Software");
$pub->save(); 
echo 'Identyfikator nowego wydawcy: '.$pub->getPublisherId();
$pub->setName("Wydawnictwo Software");
$pub->save();
echo 'Kasujemy dane';
$pub->delete();

Listing 5. Sposoby wyszukiwania obiektów

<?php
$old_inc_path = ini_get('include_path');
ini_set('include_path',$old_inc_path.';F:/www/phpsolmag/propel/propel-1.0.0/runtime/classes');
require_once('propel/Propel.php');
Propel::init(dirname(__FILE__).'/conf/bookstore-conf.php');
include_once 'bookstore/Publisher.php';
$pub = PublisherPeer::retrieveByPK(14);
print_r($pub);
$c = new Criteria();
$c->add(PublisherPeer::NAME, "%Wyd%", Criteria::LIKE);
$pubs_arr = PublisherPeer::doSelect($c); 
print_r($pubs_arr);
$c = new Criteria();
$criterion = $c->getNewCriterion(PublisherPeer::NAME, "%Wyd%", Criteria::LIKE,Criteria::LIKE);
$criterion->addOr($c->getNewCriterion(PublisherPeer::NAME, "%Helion%", Criteria::LIKE, Criteria::LIKE));
$c->add($criterion);
$pubs_arr = PublisherPeer::doSelect($c);
print_r($pubs_arr); 
$sql = "SELECT * FROM ".PublisherPeer::TABLE_NAME." WHERE LEFT(".PublisherPeer::NAME.",1) = 'W'";
$con = Propel::getConnection(PublisherPeer::DATABASE_NAME);
$stmt = $con->createStatement();
$pubs_arr =  PublisherPeer::populateObjects($stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM));
print_r($pubs_arr);
?>
Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (0)
Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2017 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System