Navigace

Hlavnφ menu

 

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

<?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...

Hulßn, Radek (10. 12. 2004)
internetov² autor a vydavatel webu WELL.DONE

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.