Zend’s PHP 5 Coding Contest – PRADO framework

10. prosince 2004

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í:

<?php
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:

<?xml version=“1.0″ encoding=“UTF-8″?>
<!– 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:

<com:TPanel ID=“startPanel“>
<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:

<div id=“startPanel“>
<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:

<?xml version=“1.0″ encoding=“UTF-8″?>
<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:

function setLevel($value){
   $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…

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *