Php Si Pagini Dinamice

Capitolul 1

Noțiuni introductive PHP.

PHP ( PHP Hypertext Preprocessor ) este un limbaj de programare ce permite modificarea paginilor web înainte ca acestea sa fie transmise de server către browserele utilizatorilor. PHP poate genera conținut HTML pe baza unor fișiere existente sau pornind de la zero, poate să afișeze o imagine sau orice alt conținut accesibil prin web, sau sa redirecționeze utilizatorul către alte pagini. În cadrul acestui proces, PHP poate consulta baze de date, fișiere externe sau alte resurse, poate trimite email-uri sau execută comenzi ale sistemului de operare. Procesarea se realizează la nivelul serverului web, înainte ca paginile web sa ajungă în browser, PHP fiind considerat un limbaj de programare server-side.

Scurt istoric

Inițial PHP însemna Personal Home Page. PHP a început în 1994 ca o extensie a limbajului server-side Perl, și apoi ca o serie de CGI-uri ( Computer Generated Imagery ) compilate de către Rasmus Lerdorf, pentru a genera curiculum vitae și a urmări numărul de vizitatori al unui site. Apoi a evoluat in PHP/FI 2.0, dar proiectul open-source a început să ia amploare după ce Zeev Surasky si Andi Gutmans, de la Technion au lansat o nouă versiune a interpretorului PHP în vara anului 1998, această versiune primind numele de PHP 3.0. Tot atunci a fost schimbat și numele în acronimul recursiv PHP Hypertext Preprocessor. În anul 1999 Zeev Surasky și Andi Gutmans au rescris baza limbajului, producând astfel și Zend Engine, iar în mai 2000 a fost lansat PHP 4.0, având la baza Zend Engine 1.0.

În data de 13 iulie 2004 a fost lansat PHP 5, cu Zend Engine II, ce a adus și o orientare obiect mai pronunțată și suportând mai multe caracteristici ale acestui tip de programare, de exemplu: introducerea extensiei PDO ( PHP Data Objects – care definește o modalitate facilă și consistentă de accesare a diferitelor baze de date ), îmbunătățiri de performanță, suport îmbunătățit pentru MySQL și MSSQL, suport nativ pentru SQLite, suport SOAP integrat, suport îmbunătățit pentru OOP ( Object Oriented Programming ), controlul erorilor prin tratarea de excepții. La sfârșitul anului 2007 doar versiunea 5.x mai era întreținută, deoarece PHP Group a anunțat ca PHP 4 a fost scos din uz, dezvoltarea versiunii PHP 6 începând din luna decembrie 2007.

Programarea web

PHP este un limbaj de programare de tip interpretat. Asta înseamnă că fișierele ce conțin cod-sursă PHP sunt interpretate ca atare în momentul execuției, de către PHP. Pentru execuția unei porțiuni de cod PHP este folosit codul-sursă așa cum a fost scris, și nu este transformat într-o formă intermediară ( binară sau cod-mașină ) cum se întâmplă în limbajele Java sau C/C++, acest lucru oferind flexibilitate, întrucât orice modificare a fișierelor sursa va fi aplicată imediat la următoarea execuție, fără alți pași intermediari. Exista și dezavantaje la acest mod de lucru, cum ar fi timpul mai mare de execuție, dar în anumite situații avantajele pot cântări mai mult decât dezavantajele. Datorită faptului că limbajul este unul interpretat, PHP mai este numit și limbaj de scripting.

În sens mai larg, acesta este un limbaj de programare universal ( general-purpose ), oferind toate facilitățile oricărui limbaj avansat, codul scris în PHP putând să facă aceleași lucruri ca un cod scris în C/C++ sau Java. În ciuda acestui fapt, PHP s-a impus în zona web, ca limbaj server-side, ce extinde funcționalitatea serverelor web. Din acest motiv programarea în PHP mai este denumită și programare web sau programare web server-side. PHP rulează pe majoritatea sistemelor de operare, de la UNIX, Windows sau Mac OS X și poate interacționa cu majoritatea serverelor web.

Arhitectura tip LAMP a devenit populara în industria web ca modalitate rapidă, gratuită și integrată de dezvoltare a aplicațiilor. Alături de Linux, Apache și Mysql, PHP reprezintă litera P; Linux ocupă rolul de sistem de operare pentru toate celelalte aplicații, MySQL gestionează bazele de date, Apache are rol de server web, iar PHP are rol de interpretator și comunicator între acestea.

PHP folosește extensii specifice pentru fișierele sale: .php, .php3, .ph3, .php4, .inc, .phtml. Aceste fișiere sunt interpretate de către serverul web iar rezultatul este trimis în formă de text sau cod HTML către browser-ul clientului.

PHP și paginile dinamice

Interpretorul PHP acționează ca o componenta adițională, o extensie a serverului web care este invocată de ori câte ori o pagina PHP este accesată. Această componentă procesează codul-sursa din pagină și apoi transmite rezultatul înapoi la web-server, ajungând în final în browserele utilizatorilor.

Deservirea unei pagini statice, fără Deservirea unei pagini dinamice, modificată

Intervenția interpretorului PHP de PHP în momentul request-ului

Din imaginea de mai sus, se poate observa că atunci când nu există un interpretor PHP, paginile sunt transmise direct către utilizatori așa cum sunt salvate pe disc, fără modificări. Pentru a actualiza conținutul acestora, este nevoie de intervenție directă asupra lor și salvarea modificărilor pe server. Aceste pagini sunt denumite “pagini statice”. De exemplu, dacă exista o pagină statică ce afișează membrii unei comunități, la fiecare înscriere a unei persoane, pagina ar trebui modificată manual de către cineva cu acces la serverul web. Folosind o secvență de cod PHP se poate prelua lista de membri dintr-o bază de date, eliminând problema actualizării – nu va mai fi nevoie să se modifice pagina odată cu fiecare membru nou, scriptul PHP va afișa în mod automat noile persoane adăugate în baza de date. Tot cu ajutorul scripturilor PHP se poate rezolva și problema linkurilor personalizate, sau a designului. Aceste pagini sunt modificate de către scriptul PHP la momentul accesării lor de către utilizatori. În funcție de parametrii primiți și de secvența de cod definită de programator, aceeași pagină poate avea conținut diferit. Aceasta proprietate este denumită dinamism, iar o astfel de pagină este considerată “pagină dinamică”.

Limbajul PHP poate lucra cu următoarele tipuri de date:

Boolean – valori logice tip adevărat sau fals, similare cu cele din C++

Integer – numere întregi ( în baza 10, 2 sau 16 ). Valoarea maximă depinde de sistem și de tipul de integer. Tipul poate fi „signed” sau „unsigned”, dacă depinde de semnul + sau – sau independent de acestea. Valorile pentru integer unsigned sunt mai mari decât cele pentru signed.

Float – cunoscute ca numere reale. Valorile maxime sunt de asemenea dependente de platformă, în general cu un maxim de ~ 1.8e308 cu o precizie de 14 zecimale după virgulă.

String – șiruri de caractere. Înainte de PHP 6, un caracter era echivalent cu un byte. Nu există limitări pentru lungimea unui șir, în afara memoriei alocate PHP.

Array – în PHP un array este un tip de dată care conține un grup de elemente. Fiecare element are un indice intern în grup, iar fiecărui îi corespunde o valoare – elementul în sine. Un astfel de grup poate fi folosit ca o simulare pentru diverse situații matematice precum vectori, serii, dicționare de elemente, liste ordonate, matrici sau matrici de matrici. Indicii și valorile unui grup pot fi orice tip de dată internă PHP ( cu excepții: obiectele, resursele și null nu pot fi indici ).

Obiecte – o clasă este o colecție de propietăți și funcții având o logică comună. Obiectele sunt instanțe ale unei clase, în care proprietățile obiectului primesc valori specifice.

Resurse – acestea sunt variabile speciale care conțin legături cu resurse externe PHP. De exemplu, conexiunea cu o bază de date este o resursă deschisă și menținută cu ajutorul unor funcții special definite.

NULL – este un tip special de dată, care semnifică că variabila respectivă nu a fost definită și că nu are valoare sau valoarea e necunoscută.

Funcții în PHP

Funcțiile sunt blocuri de cod PHP ( secvențe de cod ) bine delimitate și identificate printr-un nume, ce execută un set de operații. Funcțiile pot fi executate de mai multe ori în cadrul unui script prin simpla apelare a numelui lor. Există funcții predefinite, specifice limbajului PHP ( cum ar fi print, empty, etc. ) ce pot fi folosite în orice moment, fără a fi nevoie de vreo acțiune speciala; și există funcții definite de utilizator. Pentru ca acestea să poată fi folosite este nevoie să fie declarate ( și implementate ).

Exemplu funcție:

<?php

function afisLuna()

{

$luni = array( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',

'Aug', 'Sep', 'Oct', 'Nov', 'Dec');

echo '<select>';

for( $i = 0; $i < 12; $i++ ) {

echo "<option>{$luni[ $i ]}</option>\n";

}

echo '</select>';

}

 echo 'Luna inceperii activitatii: ';

afisLuna();

 echo '<br /><br />Luna terminarii activitatii: ';

afisLuna();

 ?>

Funcțiile sunt folosite deoarece prezintă anumite avantaje, de exemplu: reutilizarea codului ( dacă este nevoie să se execute aceeași secvență de cod în mai multe părți ale unui program sau script, pentru a nu rescrie codul de fiecare dată, se definește o funcție care este apelată de mai multe ori ), modularizare ( împarțirea codului în module, fiecare modul reprezentând un subprogram, implementat într-o funcție care contribuie la rezultatul final ), menținerea ușoară a codului și înțelegerea mai ușoară a logicii aplicației sau a scriptului. Dacă un script este structurat, împărțit în bucăți mai mici, în care aceleași secvențe de cod nu se repeta, atunci va fi mai ușor și de înțeles și de modificat sau întreținut.

Formulare

Formularele sunt elementele prin intermediul cărora utilizatorii trimit date către server. Pe o pagină web pot fi introduse diferite tipuri de informații ( parole, comentarii, mesaje, etc. ), toate acestea fiind transmise către servere prin intermediul formularelor ( in engleză „form” ). Odată transmise, datele pot fi prelucrate folosind PHP. Astfel, ele pot fi salvate într-o bază de date, în fișiere, trimise prin email, sau doar afișate înapoi pe o pagină. Formularele sunt întâlnite în orice aplicație web ( cele mai uzuale fiind paginile de login, contact și înregistrare ), fiind esențiale în folosirea zilnică a internetului. Pentru a introduce date pe o pagină web trebuie să existe un formular, în HTML fiind definit prin tag-ul form. Un form trebuie sa conțină obligatoriu următoarele două atribute: „action” și „method”.

Action reprezintă locația unde vor fi transmise datele, reprezentată prin numele fișierului ce va prelucra requestul ( de regulă un fișier PHP ). Acest atribut poate fi gol, specificând că datele for fi transmise către același script ce afișează formularul ( fișierul curent ). Method specifică metoda de acces reprezentând modul în care cerințele pentru o pagină web și alte informații aferente sunt transmise de la browser la serverul web. Există 8 metode definite:

GET – este cea mai uzuală metodă, folosită atunci când serverului i se cere o resursă.

HEAD – se comportă exact ca metoda GET, dar serverul returnează doar antetul resursei, ceea ce permite clientului să inspecteze antetul resursei, fără a fi nevoit să obțină și corpul acesteia.

PUT – metoda este folosită pentru a depune documente pe server, fiind inversul metodei GET.

POST – metodă proiectată pentru a trimite date de intrare către server/

DELETE – este opusul metodei PUT.

TRACE – este metodă folosită de obicei pentru diagnosticare, putând da mai multe informații despre traseul urmat de legătura HTTP, fiecare server proxy adăugându-și semnătura în antetul Via.

OPTIONS – este folosită pentru identificarea capacităților serverului Web, înainte de a face o cerere.

CONNECT – este o metodă folosită de către serverele intermediare.

Exemplu formular simplu de login în PHP:

<?php

# Username și parolă

$user_corect = 'admin';

$parola_corecta = 'ghiceste-Ma';

# se verifică dacă se accesează pagina ca urmare a unui request POST

$mesaj = '';

if( isset( $_POST ) && !empty( $_POST[ 'trimite' ] ) ) {

# notă: se va intra pe ramura aceasta a lui if atunci când utilizatorul face click pe butonul "Login"

# Atunci când pagina este accesata normal (scriind adresa in browser)

# variabila $_POST este goala

$erori = 0;

# validăm datele, presupunem ca nu sunt erori si verificăm valorile introduse

if( !isset( $_POST[ 'user' ] ) || strlen( $_POST[ 'user' ] ) == 0 ) {

$mesaj = 'Numele de utilizator nu a fost specificat';

$erori = 1;

} elseif( !isset( $_POST[ 'pass' ] ) || strlen( $_POST[ 'pass' ] ) == 0 ) {

$mesaj = 'Parola nu a fost specificata';

$erori = 1;

}

# dacă nu au fost erori, atunci se fac prelucrările

if( $erori == 0 ) {

if( $_POST[ 'user' ] === $user_corect &&

$_POST[ 'pass' ] === $parola_corecta )

{

# login realizat, redirecționare

echo 'Ati fost autentificat. Veti fi redirectionat…';

exit; # nu se mai afișează nimic altceva

} else {

# nu s-a realizat login

$mesaj = 'Username-ul sau parola sunt gresite';

}

}

}

?>

<html>

<head>

<title>Aplicatie formular: pagina de login – Invata PHP</title>

</head>

<body style="font-family: verdana,sans-serif; font-size: small;">

<form action="" method="post" style="width: 30%">

<fieldset>

<legend>Date de autentificare</legend>

<input type="text" name="user" /> User<br />

<input type="password" name="pass" /> Pass<br />

</fieldset>

<fieldset>

<legend>Actiuni</legend>

<input type="submit" value="Login" name="trimite" />

<input type="reset" value="Curata formular" />

</fieldset>

</form>

<?php

# se afișează mesajul de eroare, în cazul existenței lui

if( strlen( $mesaj ) > 0 ) {

echo '<p style="color: red">', $mesaj, '</p>';

}

?>

</body>

</html>

Headere

Headerele sunt elemente prin care browser-ul și serverul web comunică în fundal pentru a afișa o pagină web. Există două tipuri de headere: cele emise de browser ( headere de request ) și cele emise de server ( headere de răspuns ).

Request headers

De fiecare dată când un utilizator accesează o pagină web, browserul trimite către server cantități mici de date sub forma request headers, aceste antete cuprinzând detalii despre pagina care a fost solicitată, modul de transfer, precum și informații despre capabilitățile browser-ului, acestea fiind trimise în mod implicit.

Exemplu:

GET /http/ HTTP/1.1

Host: php.punctsivirgula.ro

Connection: close

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ro; rv:1.9.1) Gecko/20090624 Firefox/3.5

Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7

Cache-Control: no

Accept-Language: de,en;q=0.7,en-us;q=0.3

Responsive headers

În răspuns la request headers primate de la browsere, serverele web trimit înapoi două tipuri de informație: headere de răspuns (response headers) și conținutul efectiv al paginii solicitate (conținut ce poate fi construit/modificat prin intermediul PHP). Headerele de răspuns conțin informații despre pagina solicitată; de exemplu: dimensiunea paginii, existența ei, tipul de conținut, etc.

Exemplu răspuns în urma solicitării unei pagini de către browser:

HTTP/1.1 200 OK

Date: Fri, 17 Jul 2009 14:54:18 GMT

Server: Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.8b PHP/5.2.6 mod_scgi/1.12

X-Powered-By: PHP/5.2.6

Set-Cookie: PHPSESSID=h8144gj13180725c2aufkrd397; path=/

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Connection: close

Transfer-Encoding: chunked

Content-Type: text/html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>

<title>Ghid PHP pentru incepatori – headere. cookies. modificarea requestului HTTP</title>

….

</html>

Cookies

Cookies reprezintă porțiuni de informații stocate în fișiere de mici dimensiuni, ce se regăsesc pe calculatorul utilizatorului create de către browser în urma comunicării cu serverul web. Cookie-urile sunt folosite pentru a identifica utilizatorii, sau pentru a păstra o evidență a vizitelor pe un site. Un cookie conține o cantitate limitată de informație iar durata acestuia poate să fie limitată ( un număr limitat de zile, până la închiderea sesiunii de lucru, etc ) sau nelimitată, de asemenea pot fi șterse cu ușurință de către utilizatori și utilizarea lor trebuie făcută cu mare atenție.

PHP conține două funcții cu ajutorul cărora se pot crea cookie-uri: setcookie și setrawcookie; datele generate pe calculatorul utilizatorului de către un site fiind transmise înapoi la server sub forma de variabila globala $_COOKIE.

Sesiuni în PHP

Cu ajutorul cookie-urilor se pot genera sesiuni in PHP, reprezentând perioada de timp în care unul sau mai multe scripturi PHP accesate la momente diferite de timp pot folosi informații comune, acestea se întind pe parcursul mai multor accesări ale diferitelor pagini, informațiile fiind stocate in cookie-uri.

Mecanismul de funcționare a sesiunilor în PHP

Sesiunea începe in momentul în care un script PHP apelează funcția session_start pentru prima dată, un cookie fiind transmis către browser-ul clientului ( header-ul de tip „Set-Cookie” ). În cookie-urile transmise se află un identificator ce poartă numele de Session ID, în baza căruia se pot face distincții între sesiunea curentă sau a altor sesiuni a altor utilizatori ce accesează site-ul în acel moment. Există cazuri în care browser-ul utilizatorului nu acceptă cookie-uri, atunci identificatorul de sesiune se va transmite printr-un parametru GET, în forma script.php?PHPSESSID=[session id] ( reprezentând un redirect automat la aceeași pagină având specificat parametrul în URL ), iar acesta va trebui inclus în toate celelalte link-uri de pe pagină pentru a asigura că toate paginile vor fi accesate cu acest parametru. Având în vedere că sesiunea se stochează în cookie-uri este necesar ca pornirea funcției session_start să fie făcută înaintea oricărei instrucțiuni sau a oricărui cod HTML.

În momentul în care o sesiune este deschisă, reaccesarea paginii, sau a alteia din cadrul aceluiași site, duce la transmiterea identificatorului de sesiune de către browser către server, acest lucru duce la faptul că orice script PHP are acces la Session ID-ul creat inițial accesând sesiunea corectă. În cazul în care este nevoie de a accesa informațiile persistente, trebuie să existe un script care să apeleze de fiecare dată funcția session_start, iar dacă există deja un Session ID disponibil, PHP va continua sesiunea existentă, datele fiind salvate si gestionate prin intermediul vectorului super-global $_SESSION.

Fișiere și directoare în PHP

PHP oferă facilități avansate în ceea ce privește lucrul cu fișierele unde se pot crea, modifica, manipula și șterge prin intermediul codului PHP. Fișierele reprezintă colecții de informații stocate pe un dispozitiv ( HDD, CD, etc. ) și pot fi clasificate în două categorii: fișiere text ( care conțin text simplu ce poate fi citit, reprezentat și modificat de către orice secvență de cod de exemplu: .txt, .html, .php, etc. ) și fișiere binare ( care conțin secvențe de text într-un anumit format și cu o structură specifică, înțeleasă de un calculator sau de o secvență de cod, de exemplu: .jpg, .png, .mp3, etc. )

Similar oricărui limbaj de programare, când se lucrează cu fișiere se efectuează următoarele operațiuni: deschiderea fișierului, citirea din fișier sau scrierea în fișier și închiderea fișierului. Exemple:

<?php

# deschiderea unui fisier si citirea din el

$id_fisier = fopen("c:\\folder\\fisier.txt", 'r'); // deschidere

fread( $id_fisier, 10 ); // citire 10 octeti din fisier

fclose($id_fisier); // inchidere

# deschiderea unui fisier, stergerea continutului si scrierea in el

$id_fisier = fopen("c:\\folder\\fisier.txt", 'w'); // deschidere

fwrite( $id_fisier, 'Text nou in fisier' );

fclose($id_fisier); // inchidere

# deschiderea unui fisier si scrierea la sfarsitul lui

$id_fisier = fopen("c:\\folder\\fisier.txt", 'a'); // deschidere

fwrite( $id_fisier, 'Text adaugat in fisier' );

fclose($id_fisier); // inchidere

?>

Din exemplele de mai sus se observă un mod de deschidere pentru citire modul ‘r’ și două moduri de deschidere pentru scriere: cu ștergerea conținutului vechi prin modul ‘w’ și cu păstrarea conținutului prin modul ‘a’ cazul în care scrierea se face la sfârșitul fișierului, imediat după conținutul vechi.

Instrucțiunile prezentate mai sus pot fi folosite pentru orice tip de fișier, text sau binar, reprezentând baza în lucrul cu fișiere. Pentru a simplifica codul de citire/scriere a unui fișier în situații generale PHP oferă funcții convertibile: file_get_contents, file_put_contents, și file. Primele două permit preluarea întregului conținut al unui fișier și punerea lui într-o variabilă string, sau preluarea valorii unei variabile și crearea unui fișier cu conținutul acesteia. A 3-a funcție permite crearea unui vector ce are ca elemente liniile fișierului specificat, creând cate un element în vector pentru fiecare linie din fișier. De menționat faptul că citirea conținutului fișierului cu file_get_contents și file, variabilele devin independente de fișier, iar orice modificare a acestora nu se reflectă și asupra fișierului.

PHP mai dispune și de funcții de gestionare a fișierelor, de exemplu: creare, copiere, modificare atribute, etc.

<?php

// copiere fisier

copy( 'sursa.txt', 'destinatie.txt' );

 // stergere fisier

unlink( 'fisier.txt' );

// redenumire sau mutare

rename( 'vechi.txt', 'nou.txt' );

// afisarea dimensiunii unui fisier in octeti

echo filesize( 'fisier.txt' );

// verificare daca un fisier poate fi citit

echo is_readable( 'fisier.txt' );

 // verificare daca un fisier poate fi scris/modificat

echo is_writable( 'fisier.txt' );

?>

În mod similar se realizează și manipularea directoarelor ( folderelor ) folosind PHP, cu ajutorul funcțiilor copy, rename, is_file, etc dar și a deschiderii directoarelor, citirii conținutului sau închiderea acestora, dar cu existența unei serii de alte instrucțiuni specifice directoarelor. De exemplu:

?php

 // afiseaza directorul curent (current working directory)

// de obicei este folderul in care se afla scriptul ce se executa

echo getcwd(); // ex. c:\scripturi

 // schimba directorul curent

chdir( 'exemple' ); // ex. c:\scripturi\exemple

 // returneaza un vector ce contine numele fisierelor si directoarelor dintr-un folder

$vector = scandir( getcwd() );

print_r( $vector );

 // verifica daca un element este director (folder)

echo is_dir( "c:\\cale\\fisier.txt" ); // afiseaza false

?>

Platforme de dezvoltare Web

O platformă de dezvoltare de aplicații web este un program, un grup de programe sau un grup de biblioteci, care ajuta în dezvoltarea rapidă a aplicațiilor. Cu ajutorul platformelor se încearcă eliminarea unor activități recurente și comune, de exemplu platforme ce oferă biblioteci pentru accesul la baza de date, pentru implementarea design-ului, managementul sesiunilor și ajută la refolosirea codului. De asemenea o platformă de dezvoltare (framework) structurează codul, pentru a face mai ușoară scrierea unui cod mai ușor de interpretat și de întreținut de către programatori. Scopul unei platforme de dezvoltare este acela de a face programarea mai ușoară, înglobând operațiile complexe în metode și declarări mai simple

Symfony Framework

Ce este symfony

Symfony este o platformă de dezvoltare ( framework ) completă concepută pentru a optimiza dezvoltarea aplicațiilor web cu ajutorul unor caracteristici cheie, cum sunt: separarea regulilor funcționării aplicației, logica comunicării cu serverul și partea de prezentare a aplicației. Symfony conține numeroase unelte și clase care au ca scop scurtarea timpului de dezvoltare a unei aplicații web și automatizează sarcinile comune în așa fel încât dezvoltatorul poate să își concentreze atenția către o parte specifică a aplicației. Rezultatul acestor avantaje este reutilizarea codului de fiecare dată când o aplicație nouă este creată.

Symfony este scris în totalitate în PHP, și este compatibil cu majoritatea platformelor de bază de date, incluzând MySQL, PostgreSQL, Oracle și Microsoft SQL Server. Acest framework poate rula pe platformele de tip *nix și Windows. Symfony a fost creat pentru a îndeplini următoarele necesități:

Un framework ușor de instalat și configurat pe majoritatea platformelor ( cu garanția funcționalitații pentru platformele Windows și *nix )

Să conțină un motor independent pentru bazele de date

Să fie ușor de folosit, în majoritatea cazurilor, dar suficient de flexibil pentru a putea fi adaptat cazurilor mai complexe

Bazat pe premisa convenției în favoarea configurării – dezvoltatorul trebuie să configureze doar nonconvenționalul

Compatibilitate cu majoritatea modelelor de design și a tehnicilor folosite pentru dezvoltarea aplicațiilor web

Cod ușor de interpretat și de citit pentru o întreținere cât mai ușoară

Enterprise-ready – adaptabil la politicile IT ( information technology ) existente și a arhitecturilor, dar și suficient de stabil pentru proiecte de lungă durată

Ușor de extins, permițând integrarea cu librăriile altor producători

Scurt istoric

Prima versiune symfony a fost eliberată în octombrie 2005 de către fondatorul Fabien Potencier, CEO-ul unei agenții web franceze bine cunoscută pentru perspectivele inovatoare în cadrul dezvoltării aplicațiilor web. În 2003 a realizat că nu exista nici o platforma open source ( cu sursa deschisă ) de dezvoltare a aplicațiilor web în PHP, iar în momentul în care PHP 5 a fost lansat, a decis că uneltele existente au ajuns la un nivel suficient de matur pentru a fi integrate într-o platformă de dezvoltare. Timp de un an a pus bazele nucleului symfony, bazându-și munca pe framework-ul Mojavi Model-View-Controller, maparea obiectelor – relaționate Propel și pe baza șabloanelor ajutatoare Ruby on Rails. Fabien a creat inițial symfony pentru proiectele Sensio, deoarece un framework eficient la dispoziție este un mod ideal pentru a dezvolta aplicații mai rapid și mai eficient. De asemenea ajută la crearea unui mediu de dezvoltare mai intuitiv, aplicațiile fiind mai robuste și mai ușor de întreținut. După ce framework-ul a fost folosit pentru câteva proiecte, Fabien a decis să dezvăluie public symfony cu licența open source, pentru a dona munca sa comunității, dar și pentru a beneficia de feedback-ul utilizatorilor.

Instalarea symfony

Pentru a rula symfony pe o platforma este necesară existența versiunii de PHP 5.3.9 sau mai nouă, JSON și ctype trebuie să fie activate, iar php.ini trebuie să conțină setarea date.timezone. Instalarea framework-ului se poate face prin executabilul de pe site-ul oficial ( rularea executabilului necesită existența PHP 5.4 sau versiuni mai noi ) sau cu ajutorul Composer.

Composer este un manager pentru dependențe folosit de aplicațiile moderne PHP și poate fi folosit pentru a crea aplicații bazate pe framework-ul symfony. Acesta se poate instala de pe site-ul oficial suportând orice platformă *nix sau Windows, necesară fiind doar existența PHP-ului 5.3.2+. O dată instalat global se trece la crearea aplicației propriu-zise symfony folosind linia de comandă create-project pentru a crea o aplicație bazată pe ultima versiune stablilă: $ composer create-project symfony/framework-standard-edition my_project_name.

Symfony permite web serverului furnizat de PHP să ruleze aplicații în timp ce acestea sunt dezvoltate cu ajutorul comenzii: $ php app/console server:run iar aplicația poate fi accesată prin URL-ul http://localhost:8000/app/example. Folosirea comenzii server:run este potrivită numai la dezvoltarea aplicației, deoarece pentru a folosi symfony pe serverele de producție, trebuie sa fie configurat Apache sau Nginx web server.

După instalarea symfony se poate trece la crearea aplicației propriu-zise.

Crearea de pagini in symfony

Prin symfony sa încercat o abordare mai convenționala și mai ușoară la cum funcționează web-ul. Fiecare interacțiune pe web este inițiată de către un request HTTP, iar scopul aplicației este acela de a interpreta request-ul și de a returna răspunsul HTTP adecvat. Symfony urmărește această filozofie și pune la dispoziția programatorilor uneltele și convențiile necesare pentru ca aplicația să rămână organizată o dată cu creșterea numărului de utilizatori și a complexității.

Crearea unei pagini noi în symfony se realizează printr-un proces simplu realizat în doi pași:

Crearea rutei: o rută definește URL-ul paginii și specifică un controller (funcție PHP) Symfony pentru a fi executat în momentul in care URL-ul unui request este identic cu calea rutei definite.

Crearea unui controller: un controller este o funcție PHP care preia request-urile primite și le transformă în obiecte Symfony Response, acestea fiind returnate utilizatorului.

Environments & Front Controllers

Fiecare aplicație symfony rulează într-un environment (mediu). Acest mediu este un set de configurații și de bundle-uri reprezentat de către o variabila string. Aceeași aplicație poate să ruleze și cu alte configurații prin rularea acesteia în diferite medii. Symfony conține 3 medii predefinite – dev, test și prod – dar de asemenea utilizatorul poate să creeze propriul mediu.

Mediile de lucru sunt folositoare permițând unei singure aplicații să ruleze într-un mediu dev construit pentru debugging ( depanare ) și alt mediu pentru productivitate, bazat și optimizat pentru viteză. În cazul mai multor medii de lucru, se pot încărca bundle-uri specifice bazate pe ce mediu este selectat, de exemplu symfony conține predefinit WebProfilerBundle care este activat doar în mediile dev și test. Framework-ul symfony vine cu două controlere accesibile web: app_dev.php care furnizează mediul dev, și app.php care reprezintă mediul prod; iar toate accesările web către symfony în mod normal trec prin unul dintre aceste controlere front. Când front controller-ul inițializează kernel-ul, se furnizează doi parametrii: mediul de lucru, dar și dacă kernel-ul va rula în modul debug, iar pentru a face aplicația symfony să răspundă mai rapid, aceste informații sunt chache-uite în directorul app/cache/, dar când modul debug este activat ( de exemplu cum se comportă în mod implicit app_dev.php) cache-ul este șters automat când se modifică orice parte a codului sau a configurării. În modul de debug symfony va lucra mai încet, dar schimbările se vor reflecta fără a fi nevoia de a șterge cache-ul manual.

Crearea de bundle-uri

În symfony un bundle este exact ca un plugin, cu excepția ca tot codul din aplicație va „trăi” în interiorul bundle-ului, acesta nefiind mai mult decât un directoriu care conține totul legat de anumite trasături, incluzând și clase PHP, configurări și chiar stylesheets și fișiere JavaScript.

Pentru a crea un bundle ( exemplu AcmeDemoBundle ) trebuie rulată comanda următoare în linia de comandă:

$ php app/console generate:bundle –namespace=Acme/DemoBundle –format=yml

În acest moment un director va fi creat în locația src/Acme/DemoBundle, și totodată va fi inserată și linia în fișierul app/AppKernel.php ca bundle-ul să fie înregistrat în kernel:

// app/AppKernel.php

public function registerBundles()

{

$bundles = array(

// …

new Acme\DemoBundle\AcmeDemoBundle(),

);

// …

return $bundles;

}

Structura directoriului de bundle este simplificată și flexibila. În mod implicit sistemul urmărește un set de convenții care au menirea sa ajute la păstrarea codului consistent pentru toate bundle-urile symfony. De exemplu bundle-ul AcmeDemoBundle conține următoarele foldere:

Controller/ – conține controlerele acestui bundle

DependencyInjection/ – conține anumite clase Dependency Injection Extension, care pot importa servicii de configurare, register compiler passes, și altele ( directoriu opțional )

Resources/config/ – înmagazinează configurările, inclusiv configurările de rutări

Resources/views/ – conține șabloanele organizate după numele controlerului

Resources/public/ – conține web assets ( imagini, stylesheets, etc. ) și este copiat sau doar legat (linked) simbolic în directoriul proiectului web/ prin comanda assets:install rulată din linia de comandă

Tests/ – acest directoriu conține toate testele pentru acest bundle

Un bundle poate fi mai mare sau mai mic în funcție de facilitățile pe care le implementează, și conține doar fișierele care sunt necesare și nimic mai mult.

Crearea de rute

Pentru o aplicație web calitativă URL-urile „frumoase” sunt imperativ necesare, de exemplu înlocuirea URL-urile de forma index.php?article_id57 cu cele /read/intro-to-basic-learning. Symfony urmărește acest lucru și încearcă simplificarea acestuia cât mai mult în așa natura încât schimbarea unor URL-uri să fie făcută doar dintr-o linie de cod în interiorul rutelor, totodată oferind și opțiunea de a defini URL-uri creative și de a putea fi legate în diferite zone ale aplicației.

Rolul rutării în symfony este acela de a analiza URL-ul și de a determina care controler ar trebui executat. Procesul este următorul:

Request-ul este analizat de către front controlerul symfony (ex: app.php)

Nucleul symfony (ex: Kernel) face cerere către router să inspecteze request-ul

Router-ul potrivește URL accesată cu o rută specifică și returnează informații despre rută, inclusiv informații despre controlerul ce trebuie executat

Kernel-ul symfony executa controlerul, care returnează în cele din urmă obiectul de răspuns

În mod implicit fișierul pentru rute în aplicația symfony este localizat în app/config/routing.yml, iar formatul fișierului poate fi XML sau PHP. În interiorul fișierului de rutare principal va fi deja generat intrarea pentru bundle-ul AcmeDemoBundle:

# app/config/routing.yml

acme_website:

resource: "@AcmeDemoBundle/Resources/config/routing.yml"

prefix: /

Acest tip de intrare este de bază; comunică aplicației symfony să încarce configurările pentru rute din fișierul Resources/config/routing.yml ( routing.xml sau routing.php în funcție de formatul selectat ) care este localizat în bundle-ul AcmeDemoBundle, iar toate configurările pentru rute sau organizările rutelor din aplicație vor fi scrise în app/config/routing.yml și importate din acest loc.

O rută este construită din două părți: calea, care reprezintă URL-ul rutei respective, și defaults array, care specifică controlerul care ar trebui executat. În sintaxa mai jos prezentată parametrul ({limit}) este wildcard, iar orice URL ( ex: /random/10, /random/234, etc. ) de forma acestuia se va potrivi cu ruta creată. Parametrul substituit {limit} va fi de asemenea comunicat controlerului pentru ca valoarea lui să poată fi generată.

# src/Acme/DemoBundle/Resources/config/routing.yml

random:

path: /random/{limit}

defaults: { _controller: AcmeDemoBundle:Random:index }

Controlere

Controlerul reprezintă o metodă PHP care se creează iar symfony o execută, aici fiind locul unde codul folosește informațiile de la request pentru a construi și a prepara resursa care este cerută. În majoritatea cazurilor rezultatul produs de controler este un obiect Symfony Response. Răspunsul poate să fie o pagină HTML, un document XML, o serie JSON, o imagine, o redirecționare, o eroare 404, sau orice altceva.

Scopul controlerului este același întotdeauna: să creeze și să returneze Response object. Pe parcursul codului acesta poate să citească informațiile despre request, să încarce o bază de resurse, să trimită un email, sau să stabilească informațiile despre sesiunea utilizatorului. Fiecare reuqest este manipulat de către un proiect symfony și are un simplu ciclu de viața, iar framework-ul are grijă de toate elementele repetitive, spre exemplu:

Fiecare request este manipulat de către fișierul front controller ( ex: app.php sau app_dev.php ) care pornește aplicația

Router-ul citește informația de la request ( ex: URL-ul ), găsește ruta care se potrivește cu informația cerută și citește parametrul _controller din rută

Controllerul din ruta potrivită este executat și codul din interiorul controlerului creează și returnează un Response object

Headerele HTTP și conținutul obiectului Response sunt trimise înapoi utilizatorului

Exemplu de controler simplu ce afișează Hello World:

// src/AppBundle/Controller/HelloController.php

namespace AppBundle\Controller;

use Symfony\Component\HttpFoundation\Response;

class HelloController

{

public function indexAction($name)

{

return new Response('<html><body>Hello '.$name.'!</body></html>');

}

}

Similar Posts