Zend's PHP 5 Coding Contest - PRADO framework
PRADO je sada komponent pro PHP 5 p°ipomφnajφcφ koncept, kter² m∙₧eme nalΘzt v Borland Delphi, p°φpadn∞ v ASP.NET. PRADO se stalo jednoznaΦn²m vφt∞zem Zend PHP 5 sout∞₧e, a to jak u porotc∙, jak u ve°ejnosti. Tφmto Φlßnkem se na tento rozsßhl² objektov² projekt pro PHP 5 podφvßme blφ₧e.
Co je to PRADO?
PRADO framework se zjevn∞ inspiroval Borland Delphi v nßzvech a v konceptu sv²ch t°φd (nalezneme zde t°φdy TApplication
, TPage
, TForm
, TComponent
, TButton
) a sv²m pojetφm pro zm∞nu ASP.NET (komponenty a jejich udßlosti, validaΦnφ mechanismus, t°φdy TServerValidateEventParameter
, TValidator
a dalÜφ).
PRADO pro svoji funkΦnost pot°ebuje PHP 5 se SimpleXML a zlib, veÜkerß konfigurace aplikace se realizuje p°es XML soubory. Autorem PRADO frameworku je Qiang Xue.
PRADO tak nabφzφ zcela nov² p°φstup k v²voji aplikacφ v PHP, vizußlnφ, komponentov² a udßlostmi °φzen² p°φstup, kter² sice nebude kompatibilnφ s existujφcφmi systΘmy a existujφcφm PHP k≤dem, ale je to velice zajφmavΘ pro k≤d nov∞ vyvφjen².
Jinou otßzkou je, jak to bude p°i pou₧itφ PRADO frameworku s pam∞¥ovou nßroΦnostφ aplikace, co₧ je v PHP problΘm. PRADO samoz°ejm∞ urychlφ a zp°ehlednφ veÜker² v²voj, dle mΘho nßzoru se ale pro skriptovacφ jazyk podobn² udßlostmi °φzen² objektov² p°φstup nehodφ, nebo¥ pro rozsßhlΘ systΘmy, kterΘ musφ °eÜit °adu po₧adavk∙ v reßlnΘm Φase, ona "programßtorskß krßsa, Φistota, jednoduchost a znovupou₧itelnost komponent" n∞co stojφ... Pam∞¥ovß a procesnφ nßroΦnost PHP je prost∞ p°φliÜ velkß.
PRADO mß ovÜem i na toto ΦßsteΦnou odpov∞∩, a to v podpo°e pro cache (statickΘ uklßdßnφ) ji₧ iniciovan²ch komponent.
Jak se pou₧φvß PRADO?
Vlastnφ aplikace se v PRADO frameworku realizuje pomocφ definice aplikace, tedy jejφch zdroj∙, komponent a udßlostφ, v XML souborech, kterΘ jsou p°edßny PRADO frameworku. Vlastnφ PHP k≤d PRADO aplikace m∙₧e b²t potom velice trivißlnφ, jednß se jen o vytvo°enφ instance objektu TApplication
a p°edßnφ XML souboru s definicφ aplikace konstruktoru tohoto objektu.
V tomto Φlßnku bych se cht∞l podφvat na aplikaci HANGMAN, kterß je dodßvßna s PRADO jako vzorov² p°φklad. Jejφ PHP k≤d je nßsledujφcφ:
require_once('WEB-INF/framework/TApplication.php');
$app = TApplication::getInstance('WEB-INF/hangman.spec');
$app->run();
?>
Definice zdroj∙ v PRADO
Mφrn∞ slo₧it∞jÜφ je u₧ potΘ XML soubor WEB-INF/hangman.spec, ve kterΘm je uvedena definice zdroj∙ aplikace HANGMAN, tedy pou₧it²ch obrazovek a komponent:
<!-- Toto je soubor se specifikacφ zßkladnφch parametr∙ aplikace. -->
<application>
<!-- Zde jsou specifikovßny lokace jednotliv²ch classpaths aplikace. -->
<classpath>hangman;framework;framework/common</classpath>
<!--
Zde jsou deklarovßny dostupnΘ strßnky:
- default (volitelnΘ): jmΘno homepage.
- cache (volitelnΘ): odkaz na cache strßnky.
-->
<pages default="HomePage" cache="">
<!-- Ka₧dß strßnka musφ mφt jedineΦnΘ jmΘno. -->
<page name="HomePage" type="HomePage" />
</pages>
<!-- DodateΦnΘ parametry, pop°φpad∞ odkaz na externφ soubory. -->
<parameters>
<parameter name="wordFile">WEB-INF/data/hangman.txt</parameter>
</parameters>
</application>
Tento konkrΘtnφ soubor aplikace HANGMAN definuje jedinou obrazovku (zpracovßvanou pomocφ t°φdy TPage
), a to HomePage
, a jeden p°ipojen² resource (soubor se slovy k uhßdnutφ, pod nßzvem wordFile
).
Vlastnφ implementace aplikace v PRADO
Definice strßnky HomePage
pokraΦuje implementacφ udßlostφ v HomePage.php souboru, Üablonou strßnky v HomePage.tpl souboru a specifikaci udßlostφ v nßvaznosti na tuto strßnku v HomePage.spec souboru.
LΘpe si to ale objasnφme na konkrΘtnφm p°φkladu. Aplikace HANGMAN nßm umo₧nφ zvolit si na zaΦßtku obtφ₧nost, ze t°ech ·rovnφ, a potom hßdat poΦφtaΦem nßhodn∞ zvolenΘ slovo. Onu volbu obtφ₧nosti a jejφ zpracovßnφ v PRADO nadefinujeme takto:
<p>This is the game of Hangman. You must guess a word, a letter at a time.
If you make too many mistakes, you lose the game!</p>
<com:TRadioButton ID="easyLevel" GroupName="level" Text="Easy game; you are allowed 10 misses." /><br/>
<com:TRadioButton ID="mediumLevel" GroupName="level" Text="Medium game; you are allowed 5 misses." /><br/>
<com:TRadioButton ID="hardLevel" GroupName="level" Text="Hard game; you are only allowed 3 misses." /><br/>
<com:TButton Text="Play!" OnClick="onSelectLevel" />
<com:TLabel ID="startError" Text="You must choose a difficulty level!" Style="color:red" Visible="false" />
</com:TPanel>
Z tΘto definice (v HomePage.tpl souboru) je patrnΘ, ₧e komponenta TPanel
, kterß je takov²m obalem pro komponenty specifickΘ, obsahuje celkem t°i komponenty typu TRadioButton
a n∞jak² popis, tedy TLabel
(echo
v PHP, vßzanΘ na ID startError
).
PRADO na zßklad∞ tΘto definice Üablony vygeneruje nßsledujφcφ XHTML k≤d:
<p>This is the game of Hangman. You must guess a word, a letter at a time.
If you make too many mistakes, you lose the game!</p>
<span><input id="easyLevel" type="radio" name="level" value="easyLevel"/><label for="easyLevel">Easy game; you are allowed 10 misses.</label></span><br/>
<span><input id="mediumLevel" type="radio" name="level" value="mediumLevel"/><label for="mediumLevel">Medium game; you are allowed 5 misses.</label></span><br/>
<span><input id="hardLevel" type="radio" name="level" value="hardLevel"/><label for="hardLevel">Hard game; you are only allowed 3 misses.</label></span><br/>
<input type="submit" name="_TButton2" value="Play!" id="_TButton2"/>
</div>
Udßlosti v PRADO
To celΘ je zatφm sice velice p∞knΘ, ale vypadß to jen jako lepÜφ template systΘm. Zde nastupuje ovÜem hlavnφ zbra≥ PRADO, a to udßlosti. Udßlosti nßm umo₧≥ujφ propojit Üablonu strßnky (jejφ komponenty) s PHP k≤dem (implementace udßlostφ).
Toto propojenφ komponent a udßlostφ se definuje ve spec souboru a pro naÜi volbu obtφ₧nosti v aplikaci HANGMAN vypadß takto:
<component>
<property name="Level" get="getLevel" set="setLevel" type="integer" default="0" />
</component>
Ke ka₧dΘ komponent∞ a jejφmu assetu zde m∙₧eme nadefinovat get
(Φtenφ) a set
metodu (nastavenφ hodnoty), kterΘ potΘ implementujeme v PHP k≤du. P°φklad? Pro stanovenφ ·rovn∞ obtφ₧nosti, kterou si zvolφ u₧ivatel, nßm postaΦφ tento PHP k≤d:
$this->setViewState('Level',$value,0);
}
function getLevel(){
return $this->getViewState('Level',0);
}
V HomePage.spec souboru je definovßno, jak je vid∞t z p°φkladu v²Üe, ₧e volba ·rovn∞ (Level
) vyvolß udßlost setLevel
(viz k≤d set="setLevel" v souboru HomePage.spec se specifikacφ udßlostφ) a tuto udßlost implementujeme ve v²Üe zmφn∞nΘm PHP k≤du.
TakovΘto propojenφ komponent s udßlostmi je sice zcela b∞₧nΘ pro jinΘ jazyky, a¥ u₧ se jednß o ji₧ zmφn∞nΘ Borland Delphi, ASP.NET Φi t°eba Javu, je ale zcela novßtorskΘ pro PHP libovolnΘ verze.
Co jeÜt∞ umφ PRADO?
PRADO pochopiteln∞ nenφ omezeno na n∞kolik "vestav∞n²ch" GUI komponent, dφky objektovΘmu programovßnφ si m∙₧eme nadefinovat °adu vlastnφch potomk∙ t°φdy TComponent
, jejich vlastnostφ, udßlostφ a zdroj∙ a ty nßsledn∞ v naÜich Üablonßch pou₧φvat. Je to prost∞ framework, kter² by bylo mo₧no rozÜφ°it tak, aby pokryl celou naÜi komplexnφ aplikaci (ten podmi≥ovacφ zp∙sob je pou₧it zßm∞rn∞).
Kam sm∞°uje PRADO?
Dokßzal bych si p°edstavit, ₧e by se podobn² koncept komponent a udßlostφ stal souΦßstφ jßdra budoucφho PHP 6, kterΘ by potom zaΦalo, i ve slo₧it²ch aplikacφch, konkurovat ASP.NET a Jav∞.
PRADO je v²bornß koncepce, kterß kopφruje ASP.NET a Borland Delphi, pop°φpad∞ Javu, ale oproti "spor¥ßku" ASP.NET Φi Jav∞ je to takov² horolezec s batohem na zßdech, kter² je obt∞₧kßn pomalostφ interpretovanΘho skriptovacφho jazyka, sna₧φcφho se s vyp∞tφm sil o objektov∞ a udßlostmi °φzenΘ programovßnφ.
Autor frameworku Qiang Xue ud∞lal rozhodn∞ skv∞lou prßci, jeho k≤d je v²born∞, mimo°ßdn∞ Φist∞ napsan². Je to v²born² programßtor a je rozkoÜφ si jeho k≤d prochßzet, nicmΘn∞, celou dobu, co jsem si s PRADO hrßl, n∞kde v pozadφ se po°ßd schovßvala myÜlenka, proΦ proboha chodit s tφm batohem na zßdech, kdy₧ mohu pou₧φt °eÜenφ jinß? Od toho tu p°ece jsou.
Jinß °eÜenφ, jmenovit∞ ASP.NET, na rozdφl od PRADO, majφ ji₧ existujφcφ rozsßhlΘ balφky komponent, zatφmco PRADO je pou₧itelnΘ jen pro pßr zßkladnφch prvk∙ GUI (formulß°∙), ale cokoli navφc si musφte naprogramovat. Sφla ASP.NET p°itom nespoΦφvß jen v jeho koncepci, kterou se PRADO pokouÜφ emulovat, ale prßv∞ v °ad∞ existujφcφch funkΦnφch a otestovan²ch komponent, kterΘ teprve znaΦn∞ usnad≥ujφ a urychlujφ prßci.
Ne₧ pou₧φvat na rozsßhlΘ a udßlostmi °φzenφ projekty PHP, osobn∞ bych mnohem rad∞ji sßhl po jinΘm prost°edku pro dosa₧enφ takovΘho cφle...
Zend's PHP 5 Coding Contest
Zend's PHP 5 Coding Contest uspo°ßdala spoleΦnost Zend p°i uvedenφ novΘ verze PHP s nov²m Zend enginem. ┌Φastnφci sout∞₧e m∞li za ·kol naprogramovat aplikace, demonstrujφcφ novΘ mo₧nosti t∞chto nßstroj∙ - ne v₧dy vÜak usp∞li. Tato sΘrie Φlßnk∙ ji₧ byla uzav°ena, aΦkoli dalÜφ pokraΦovßnφ nelze vylouΦit.
- Zend's PHP 5 Coding Contest - uΦφme se PHP z chyb ostatnφch
- Zend's PHP 5 Coding Contest - trochu mΘn∞ teorie a vφce praxe
- Zend's PHP 5 Coding Contest - PRADO framework (prßv∞ Φtete)
- Zend's PHP 5 Coding Contest - wtcSQLite