2008.08_Przyszłość Symfony wersja 1.1 – prawdziwa rewolucj_[Narzedzia Programistyczne].pdf

(364 KB) Pobierz
441706420 UNPDF
Narzędzia programistyczne
Przyszłość Symfony
wersja 1.1 – prawdziwa rewolucja
W chwili kiedy piszę te słowa dostępna jest już wersja beta Symfony 1.1.
Wydanie to jest swoistą rewolucją, więc warto przedstawić nowości, które
się w nim pojawią.
Dowiesz się:
• Co nowego znajdzie się w wersji 1.1 framewor-
ka Symfony.
Powinieneś wiedzieć:
• Co to jest Symfony;
• Jak działały walidatory, helpery oraz formula-
rze w Symfony 1.0
Widżety
Widżet jest obiektem, który może być rendero-
wany jako kod HTML. Widżetów używamy w
zastępstwie helperów. Stwórzmy teraz przykła-
dowy widżet.
Poziom trudności
Ograniczenie
zależności i EventDispatcher
Symfony 1.1 zawiera mocno zmodyfikowa-
ną strukturę klas podstawowych w porów-
naniu do wersji 1.0. Zmiany polegają przede
wszystkim na usunięciu zależności oraz sin-
gletonów.
Struktura zależności wersji 1.0 i 1.1 zo-
stała przedstawiona na Rysunku 1 i 2 odpo-
wiednio.
$w = new sfWidgetFormInput();
//tworzy nowy widżet typu input
echo $w->render(’irst_name’, ‘Marcin’);
//wyświetla widżet
N owy framework zadań będzie zorgani-
Zastosowanie takiej konstrukcji pozwoli nam
uzyskać następujący znacznik HTML:
zowany wokół przestrzeni nazw. Będzie
także dużo łatwiejszy w rozbudowie.
Porównanie przestrzeni nazw wybranych za-
dań znajduje się w Tabeli 1. Wbudowany zosta-
nie także system pomocy.
Wyświetlmy dla przykładu pomoc do zada-
nia plugin-install :
<input type=”text” name=”irst_name”
value=”Marcin” id=”irst_name” />
Nowe formularze,
widżety i walidacja
W kwestii powyższych zagadnień możemy mó-
wić o zupełnie nowym podejściu. Podejście to
opiera się na trzech filarach:
Symfony 1.1 daje nam także do dyspozycji kla-
sfWidgetFormSchema . Klasa ta reprezentu-
je grupę widżetów. Stwórzmy zatem dwa po-
la tekstowe odpowiadające imieniu oraz na-
zwisku:
symfony help plugin:install.
Istotną nowością jest także możliwość wywo-
łania zadania bezpośrednio z kodu aplikacji:
widżety – sfWidget
walidatory – sfValidator
oraz sfValidatorSchema
formularze – sfForm
$w1 = new sfWidgetFormInput();
$w = new sfWidgetFormSchema(array(‘irst
_name’ => $w1,‘last_name’ => $w1,));
$task = new sfCacheClearTask($dispatcher);
$task->run();
Zestaw taki wyświetlimy za pomocą polecenia:
Możemy tego dokonać dzięki oddzieleniu za-
dań od CLI (ang. command line interface ).
Każdy z nich stanowi oddzielny podsystem,
w pełni niezależny od pozostałych. Przyjrzyj-
my się im bliżej.
$w->render(null, array('irst_name'
=> 'Marcin', 'last_name' =>
'Świerczyński', ));
Tabela 1. Porównanie nazw wybranych zadań
Symfony 1.1
Symfony 1.0
generate:app
init-app
generate:batch
init-batch
generate:controller
init-controller
generate:module
init-module
generate:project
init-project
test:all
test-all
test:functional
test-functional
test:unit
test-unit
74
08/2008
441706420.024.png 441706420.025.png 441706420.026.png 441706420.027.png 441706420.001.png 441706420.002.png 441706420.003.png 441706420.004.png 441706420.005.png 441706420.006.png
Przyszłość Symfony – wersja 1.1
Obiekty klasy sfWidgetFormSchema są obiek-
tami klasy sfWidget , więc pozycją zestawu
może być inny zestaw, co jest przedstawione
na Listingu 1.
Walidatory
Walidatory służą do sprawdzania poprawności
oraz „oczyszczania” wprowadzanych danych.
Zobaczmy jak działają w praktyce (Listing 4).
Podobnie, jak w przypadku widżetów, wa-
lida tory możemy grupować (Listing 5). Jak
widzimy, funkcji clean() musimy podać ta-
blicę wartości, odpowiadających konkretnym
polom.
Zestawy walidatorów również możemy za-
gnieżdżać, co przedstawia Listing 2.
Listing 1. Zagnieżdżanie widżetów
$authorWidget = new sfWidgetFormSchema ( array ( 'irst_name' = > $w1 , 'last_name' = > $w1 , )) ;
$bookWidget = new sfWidgetFormSchema ( array ( 'title' = > $w1 , 'sub_title' = >
$w1 , 'author' = > $authorWidget , )) ;
$bookWidget - > render ( null, array (
'title' = > 'The symfony book' ,
'sub_title' = > 'The deinitive guide' ,
'author' = > array (
'irst_name' = > 'Fabien' ,
'last_name' = > 'Potencier' ,
) , )) ;
Formularze
Formularze stanowią rodzaj spoiwa między wi-
dżetami, a walidatorami. Sercem formularzy
jest klasa sfForm .
Klasa ta zapewnia nam dostęp do metod
umożliwiających budowanie HTML-owych
formularzy, obsługę walidacji ich pól, a także
zapis i pobieranie danych – słowem całej funk-
cjonalności niezbędnej do budowania tych
podstawowych elementów interakcji z użyt-
kownikiem.
Stwórzmy zatem pierwszy formularz. Kod
znajduje się na Listingu 3.
To właściwie wystarczy, aby wyświetlić for-
mularz: echo $form . Możemy także wyświetlić
jedynie imię autora.
W tym celu użyjemy konstrukcji echo
$form['first_name']; , która zwróci nastę-
pujący kod:
Listing 2. Zagnieżdżanie walidatorów
$authorValidator = new sfValidatorSchema ( array ( 'irst_name' = > $v1 , 'last_name' = > $v1 , )) ;
$bookValidator = new sfValidatorSchema ( array ( 'title' = > $v1 , 'sub_title' = >
$v1 , 'author' = >
$authorValidator , )) ;
$bookValidator - > clean ( array (
'title' = > 'The symfony book' ,
'sub_title' = > 'The deinitive guide' ,
'author' = > array (
'irst_name' = > 'Fabien' ,
'last_name' = > 'Potencier' ,
) , )) ;
<input type="text" name="irst_name"
value="Marcin" id="irst_name" />
������������������������
Na szczególną uwagę zasługuje klasa
sfFormPropel , która odpowiada za genero-
wanie formularzy na podstawie obiektów
Propela.
Dzięki niej może mapować typy danych z
Propela na widżety i walidatory. Funkcjonal-
ność ta dotyczy w szczególności kluczy obcych
i relacji wiele-do-wielu.
���������
������
Coś jeszcze?
Formularze, widżety, walidatory oraz modyfi-
kacja architektury to chyba najważniejsze zmia-
ny, jakie wprowadzono w wersji 1.1. Najnowsza
edycja wniesie jednak masę drobniejszych po-
prawek i funkcjonalności.
Na pewno na uwagę zasługuje manager plug-
inów, który został napisany zupełnie od nowa.
Zapewniać on będzie obsługę zależności mię-
dzy wtyczkami.
Poprawiono także integrację z Propelem. Zo-
stał on włączony jako plug-in do standardowe-
go wydania frameworka. Od teraz deklarowa-
nie zachowań będzie możliwe wprost ze sche-
matu, który to z kolei będzie mógł być nadpi-
sany przez inny.
Ponadto umożliwiono definiowanie danych
testowych dla relacji wiele-do-wielu (w plikach
fixtures ).
Zmiany nie ominęły także mechanizmu ro-
utowania. Wprowadzono warstwę cache’ującą,
co zapewni znaczny wzrost wydajności w przy-
padku serwisów z dużą ilością URLi do wyge-
nerowania.
����������
������
���������
��������
���������
������
���������
����������
Rysunek 1. Struktura zależności w Symfony 1.0. Źródło: Prezentacja z IPC 2007, Frankfurt
www.sdjournal.org
75
441706420.007.png 441706420.008.png 441706420.009.png 441706420.010.png 441706420.011.png 441706420.012.png 441706420.013.png 441706420.014.png 441706420.015.png 441706420.016.png 441706420.017.png 441706420.018.png 441706420.019.png 441706420.020.png 441706420.021.png
 
Narzędzia programistyczne
Listing 3. Przykładowy formularz
class AuthorForm extends sfForm {
public function conigure( ) {
$this - > setValidatorSchema ( $authorValidator ) ;
$this - > setWidgetSchema ( $authorWidget ) ;
}
}
$form = new AuthorForm () ;
$input = array ( 'irst_name' = > 'Marcin' , 'last_name' = > 'Swierczynski' ) ;
$form - > bind ( $input ) ;
if ( $form - > isValid ()) {
$form - > getValues () ; // wartości przygotowane do obróbki
} else {
$form - > getErrorSchema () ; // obsługa
błędów
}
W temacie cache’owania również może-
my spodziewać się nowości. Umożliwio-
no wykorzystanie innych miejsc składowa-
nia cahce’a (np. Memcached), a także usu-
nięcie cache’a z poziomu innej aplikacji, niż
bieżąca.
Generalnie mechanizm cache’owania bę-
dzie można teraz zastosować nie tylko do
warstwy widoku, ale też np. do warstwy mo-
delu.
Zmiany w cache’owaniu wpłyną także na in-
ternacjonalizację aplikacji. Będzie ona teraz wy-
korzystywała te same techniki, co warstwa wi-
doku, co zapewni dużo szybsze generowanie
szablonów.
Ponadto nowe zadania umożliwią wyszu-
kanie ciągów znaków niedostosowanych do
internacjonalizacji, a także znalezienie nie-
przetłumaczonych tekstów. Będą to symfo-
ny i18n:find i symfony i18n:extract odpo-
wiednio.
Usprawniono także etap konfiguracji aplika-
cji. Zintegrowano lepszy parser YAML, a także
zaimplementowano nowe, pomocne komuni-
katy o błędach w plikach YAML.
Listing 4. Przykładowy walidator
$v = new sfValidatorString ( array ( 'min_length' = > 4 )) ; //ciąg znaków o długości co
najmniej 4
$value = $v - > clean ( 'Marcin' ) ;
//$value == ‘Marcin’
$v - > setOption ( 'trim' , true ) ;
$value = $v - > clean ( ' Marcin ' ) ;
//$value == ‘Marcin’
Mała rewolucja
Te wszystkie zmiany sprawiają, że nowe wy-
danie Symfony będzie pewną rewolucją. Kod
frameworka został bardzo dopracowany. Po-
dwojono także liczbę testów jednostkowych (z
4 do 8 tysięcy), co oznacza, że możemy two-
rzyć aplikacje w oparciu o nową wersję, ma-
jąc właściwie pewność, że będą wydajne i bez-
pieczne.
Warto jeszcze zaznaczyć, że istniejące aplika-
cje, korzystające z rozwiązań wersji 1.0 można
uruchamiać w trybie zgodności.
W tym celu musimy włączyć opcję com-
pat_10 w pliku apps/nazwaAplikacji/config/
settings.yml :
Listing 5. Grupowanie walidatorów
$v1 = new sfValidatorString ( array ( 'min_length' = > 4 )) ;
$v = new sfValidatorSchema ( array ( 'irst_name' = > $v1 , 'last_name' = > $v1 , )) ;
$v - > clean ( array ( 'irst_name' = >
'Marcin' , 'last_name' = >
'Swierczynski' , )) ;
������������������������
���������
������
all:
.settings:
compat_10: on
����������
������
Zapewne wielu programistów zdecyduje się
na takie rozwiązanie w istniejących projek-
tach, jednak nowopowstające aplikacje warto
tworzyć w oparciu o mechanizmy zawarte w
Symfony 1.1.
�����������������
���������
������
���������
���������
��������
MARCIN ŚWIERCZYŃSKI
Autor jest współzałożycielem irmy TeamLab.pl,
specjalizującej się w wytwarzaniu oprogramowa-
nia klasy enterprise. Studiuje w Polsko-Japońskiej
Wyższej Szkole Technik Komputerowych w Warsza-
wie. Interesuje się programowaniem (Java, PHP),
bazami danych oraz projektowaniem stron inter-
netowych.
Kontakt z autorem: marcin@swierczynski.net
����������
Rysunek 2. Struktura zależności w Symfony 1.1. Źródło: Prezentacja z IPC 2007, Frankfurt
76
08/2008
441706420.022.png 441706420.023.png
 
Zgłoś jeśli naruszono regulamin