Sărbătoarea în simfonie 2

Cadrele sunt subiecte fierbinți în industria web și au fost de ceva timp. În această mare varietate de arome este Symfony - un cadru vast PHP care urmează paradigma populară MVC. Curba de învățare este probabil puțin mai puternică decât concurenții săi, cum ar fi CodeIgniter. Nu vă faceți griji, odată ce va crește, vă veți simți mai puternic ca oricând și veți putea dezvolta aplicații fantastice.


1. Cerințe

În acest articol va trebui să utilizați un program de consolă. Îmi place Git Bash personal, dar orice va face. Va trebui, de asemenea, să aveți instalat curl pentru a instala Composer.

Dacă sunteți utilizator Windows, puteți obține toate pachetele de mai sus, instalând Git pentru Windows, care este disponibil aici: Git descărcări.


2. Ce veți învăța

În acest articol veți afla mai multe despre:

  • Fluxul aplicației Symfony
  • Instalarea Symfony 2.1 utilizând Composer
  • Structura și pachetele de fișiere Symfony
  • Consola
  • Trasee și controlori
  • Răspunsuri
  • Crenguţă

3. Un ciclu de viață Symfony

Înainte de a ne lua mâinile murdare și pietricele, vreau să folosesc un moment pentru a explica fluxul ciclului de viață Symfony.


Cererea

Ca orice altceva de pe web, totul începe cu o cerere. Aceasta este preluată de Symfony, care se va potrivi cu rutele definite (nu vă faceți griji, acest lucru va fi explicat mai târziu), care sunt apoi potrivite cu controlorii. Deci, le spunem Symfony care URL-uri vrem să se potrivească cu anumiți controlori și funcțiile lor.

Kernel-ul

Aici se petrece magia. Symfony va diseca adresa URL și o va potrivi cu una dintre rutele noastre. Acesta va încărca apoi controlerul pe care l-am atribuit rutei.

Controlerul

Controlerul este încărcat și o acțiune dată este executată pe baza traseului.

Raspunsul

La fel ca în cazul unei solicitări HTTP normale, o solicitare Symfony trebuie să returneze un obiect de răspuns.
Obiectul de răspuns poate fi format în diverse moduri, de exemplu cu anteturi.
O acțiune trebuie să returneze un obiect de răspuns valid sau altfel o excepție va fi aruncată.

Deci, acum ați făcut o scurtă prezentare a mecanicii din Symfony - acum este momentul să vă aruncați în aer.


4. Instalarea prin compozitor

Unul dintre lucrurile frumoase despre dezvoltarea web-ului de astăzi este instrumentul disponibil pentru facilitarea procesului. Unul dintre ele este Composer - un manager de pachete pentru PHP. Acest articol nu va include detaliile utilizării compozitorului, dar dacă sunteți interesat, aceasta este o introducere minunată: Easy Package Management with Composer

Mai întâi, dacă nu aveți instalat în întreaga lume Composer, puteți descărca o instalare locală executând următoarea comandă:

 curl-uri http://getcomposer.org/installer | php

Testați că instalarea a funcționat prin tastarea:

 php compozitor.phar

Dacă totul a mers fără probleme, ar trebui să vedeți un meniu de comenzi disponibile. Dacă nu, verificați dacă ați configurat PHP în variabilele de mediu.

Acum vom trece la instalarea Symfony. A inlocui dvs. dosar cu orice nume de folder doriți pentru proiectul dvs. De asemenea, puteți înlocui versiunea la sfârșit cu oricare dintre opțiunile dvs. Vă recomandăm să verificați ambalajul: Symfony Framework Standard Edition pentru cea mai recentă lansare stabilă.

 php compozitor.phar crea-proiect simfonie / cadru-standard-ediție dosarul / 2.1.4

Ar trebui să vedeți acum dependențele de descărcare a Compozitorului în dosar. Dacă ați instalat bine, mergeți la dvs.-project.local / web / config.php - aici Symfony vă va spune despre cerințele serverului care lipsesc sau despre extensiile opționale care ar putea crește performanța sau ușura dezvoltarea.

Când ați activat extensiile dorite și opționale, mergeți la /web/app_dev.php unde ar trebui să vedeți un ecran de întâmpinare cu link-uri pentru diverse experiențe de învățare. Aceasta înseamnă că Symfony a fost instalat cu succes - felicitări!


5. Introducere în structura și pachetele simfonice ale fișierelor

La prima vedere, dosarul rădăcină ar putea părea puțin confuz. Nu vă faceți griji, există o explicație logică în spatele structurii. Rădăcina dvs. ar trebui să fie formată din acești patru dosare și unele fișiere. Puteți ignora fișierele, deoarece acestea nu sunt importante chiar acum.

 app / src / vendor / web /

Directorul de aplicații

Aici merge configurația la nivel înalt a proiectului. De exemplu, acesta este sediul AppKernel clasă care încarcă toate codurile și bibliotecile terților în cadrul pentru utilizarea dvs..

aplicaţia directorul conține, de asemenea, toate fișierele de configurare principale, care conțin informații despre autentificarea bazei de date, modele de securitate, rutare și multe altele.

De asemenea, aspectul dvs. HTML de bază se află aici.

Directorul Src

src directorul este acasa pentru tot codul propriu, care este grupat in pachete.

Cine sau ce este un pachet?

Toate codurile Symfony sunt grupate logic în ceea ce este cunoscut sub numele de pachete. De exemplu, spuneți că proiectul dvs. are un sistem de utilizator, atunci toți utilizatorii dvs., CSS, JavaScript, entități bază de date și așa mai departe, vor fi conținute într-un UserBundle. Ce este minunat în legătură cu acest sistem este că puteți lua un pachet (de exemplu un pachet de gestionare a utilizatorilor) și conectați-l la orice proiect Symfony.

Puteți descărca chiar pachete gata de utilizare de pe site-uri web, cum ar fi Bundle KNP. Printre alegerile populare se numără pachetele de sisteme de utilizator și pachetele generatoare de generatoare CRUD. La momentul redactării acestui articol, site-ul are 1779 de pachete și 4068 de dezvoltatori.

Directorul vânzătorilor

Aici vom stoca toate bibliotecile terților. Acesta este deja plin de biblioteci, de exemplu Symfony, Doctrine, Assetic și multe altele.

Director Web

Acesta ar trebui să fie directorul rădăcină al domeniului dvs., deoarece acesta este singurul director accesibil publicului pentru proiectul dvs. Aceasta este caseta controlorilor dvs. frontali app.php și app_dev.php fișiere, care sunt cele două puncte de acces public la aplicația dvs. Un utilizator va intra pe site-ul dvs. printr-un URL cum ar fi /app.php/products/jeans.

  • app_dev.php este principalul punct de intrare în timp ce vă dezvoltați aplicația. Când utilizați acest lucru ca punct de intrare, Symfony va sări peste cache și vă va furniza o bara de instrumente de dezvoltare minunată.
  • app.php este punctul de intrare pentru modul de producție. Acest lucru este facut de fapt prin optiune mod_rewrite, astfel încât adresele URL /app.php/products/jeans și / produse / blugi de fapt, ambele indică aceeași locație.

6. Codarea cu consola ... Așteptați, ce?

Consola sa dovedit a fi un instrument strălucit în procesul meu de dezvoltare și așa îți spun: Nu te vei teme de consola ta, căci tu ești creatorul tuturor lucrurilor.

Pentru mine, unul dintre lucrurile (minunat) ciudate despre trecerea la Symfony a fost folosirea grea a consolei.

Hai să ne aruncăm cu grijă. Deschideți consola și localizați rădăcina proiectului. Introduceți această comandă:

 aplicația / consola php

Acestea sunt comenzile la dispoziția dumneavoastră. În cea mai mare parte veți folosi generatoarele, cache-ul și managementul activelor. Veți utiliza, de asemenea, acest lucru pentru a genera pachete, a genera scheme de baze de date, rute de depanare, de compensare a cache-ului și multe altele.


7. Destul de bine. Vreau să codific!

Cu câteva cunoștințe de bază despre structură și consolă, sunteți gata să vă aruncați în Symfony!

Mergi la app_dev.php. Ecranul de întâmpinare pe care îl vedeți aici este de fapt un pachet, ca cel pe care îl vom crea într-un minut. Mergi la src / și ștergeți directorul Culme. Dacă actualizați pagina, veți vedea o eroare. Acest lucru se datorează faptului că AppKernel clasa încearcă să încarce pachetul pe care tocmai l-am șters. De fiecare dată când adăugați sau eliminați un pachet, va trebui să îl editați AppKernel clasă.

Atât de deschis app / AppKernel.php. Veți vedea o matrice cam așa:

 $ bundles = array (noul Symfony \ Bundle \ FrameworkBundle \ FrameworkBundle (), // ... Alte pachete aici);

Aici veți iniția pachete noi. Dacă creați un pachet prin consola, acesta va fi adăugat automat.

În continuare, ar trebui să vedeți un bloc astfel:

 dacă (in_array ($ this-> getEnvironment (), array ('dev', 'test'))) $ bundles [] = nou Acme \ DemoBundle \ AcmeDemoBundle (); // ... Alte pachete aici

Acestea sunt pachete de dezvoltare, adică pachete care sunt încărcate numai când vă aflați în mediul de dezvoltare (app_dev.php). Veți vedea că aici este inițializat pachetul eliminat. Scoateți AcmeDemoBundle linie și salvați fișierul.

Dacă actualizați, acum veți vedea pagina de excepție Symfony. Acesta este locul în care toate excepțiile prinse vă vor redirecționa și afișa mai multe informații. Veți vedea o excepție care are loc în felul următor:

 Nu se poate importa resursa "@ AcmeDemoBundle / Controller / SecuredController.php" ... 

Acest lucru se datorează faptului că Symfony caută rute definite în fișierul controlerului SecuredController.php (care a fost în AcmeDemoBundle șters).

Deci, ce este o rută??

Acum este probabil un moment bun pentru a explica mai mult despre rute. Practic, un traseu este un șablon de adresă URL. Imaginați-vă că aveți un blog, cu postări, pe categorii diferite. Deci, veți dori ca utilizatorul să introducă într-un URL ceva similar:

 www.myblog.com/categories/Category1 www.myblog.com/categories/Category2 și așa mai departe ... 

În Symfony puteți defini șabloane de adrese URL pe care le potriviți unui controler. Imaginați-vă exemplul anterior. Ați avea nevoie de o funcție, care a primit numele de categorie și a căutat postări de blog pe care le folosește. Într-o aplicație MVC și, prin urmare, în Simfony, această funcție este înfășurată într-un controler. Asadar ar arata astfel:

 class ControllerExemplu public function showCategory ($ category_name) // Trageți mesajele de blog după numele categoriei și afișați-le

Notă: Acesta nu este un cod Symfony valabil, ci doar un exemplu de controler de blog simplu.

Acum, va trebui doar să conectați acțiunea controlerului și adresa URL. Acest lucru se face prin rute. Traseul în acest caz ar arăta astfel:

 / Categorii / name

Atunci când un șir este scris în bretele curl, este interpretat ca o variabilă, care este apoi trecut la acțiunea dată. În Symfony puteți defini rute în XML, YML sau prin adnotări. Pentru a ne menține simplu, vom folosi doar adnotări în acest tutorial.

Puteți vedea toate rutele definite utilizând următoarea comandă din consola:

 php app / console router: depanare

Dar amintiți-vă, am avut o eroare. Acest lucru se datorează faptului că Symfony continuă să caute rutele definite în lista noastră AcmeDemoBundle controler (care nu există). Deci, deschide-te app / config / routing_dev.yml și pentru moment, tot ce trebuie să știți este că toate rutele sunt definite sau importate în routing.yml și routing_dev.yml. Ștergeți _demo, _Bine ati venit și _demo_secured chei. Dacă vă reîmprospătați, acum veți vedea Nu a fost găsit niciun traseu pentru "GET /". Acest lucru se datorează faptului că nu există rute care să corespundă adresei URL actuale - deci facem una care face.

Dar mai întâi un controlor

Când scrieți rute ca adnotări, le scrieți chiar deasupra acțiunii pe care doriți să o executați atunci când un utilizator intră pe ruta dată. Prin urmare, ceea ce avem nevoie acum este un pachet, care va menține controlorul și acțiunea noastră.

Deschideți consola și introduceți următoarea comandă:

 Aplicația / consola php generează: pachet

În primul rând, trebuie să introduceți spațiul de nume al pachetului dvs. Modelul general pentru aceasta este:

 Vânzător / BundleName

Furnizorul este autorul pachetului. Aici puteți pune numele companiei sau orice doriți. Îmi place să-mi folosesc inițialele EP. Utilizați tot ce doriți, dar păstrați-l scurt.

Numele pachetului trebuie să se încheie cu Bundle. Deci, voi intra în următoarele:

 EP / BlogBundle

Apoi, puteți alege numele pe care doriți să îl utilizați atunci când identificați pachetul în codul dvs..
De obicei, omite numele vânzătorului, dar de dragul acestui tutorial, trebuie doar să apăsați pe Enter.
Există mai mulți pași în generatorul, dar veți dori valori implicite pentru acest tutorial, așa că apăsați doar pe Enter până când treceți.

Acum deschis src / YourVendorName / BlogBundle / în editorul tău. Veți vedea că a fost creată o structură de pachet de bază pentru dvs. În acest moment vom trece peste detaliile și vom merge direct în directorul de controler. Deschis DefaultController.php în controler /.

Acest lucru arată foarte mult ca exemplul de bază pe care l-am scris anterior, cu excepția faptului că controlerul este un derivat al Controlorului - o clasă din pachetul cadru Symfony, care deține funcționalitatea de bază pentru un controler.

Dacă priviți acțiunea, veți observa câteva adnotări care arată astfel:

 / ** * @Route ("/ hello / nume") * @Template () * /

@Traseu adnotarea spune Symfony că vrem să potrivim ruta / Alo / name cu acțiunea \ EP \ BlogBundle \ Controler \ DefaultController :: indexAction () și că există o variabilă numită Nume în URL. Deci, dacă cineva intră în URL-uri similare cu acestea:

 www.myblog.com/hello/Esben www.myblog.com/hello/Santa www.myblog.com/hello/Jesus

... toți vor merge în același loc, pentru că toți vor fi potriviți / Alo / name traseu.

@Template adnotare spune Symfony care View pentru a utiliza. Când este lăsată goală, Symfony va ghici ce vizualizare să utilizeze vizualizarea bazată pe numele controlerului și numele acțiunii.

Dar nu ar trebui ca toate acțiunile să returneze un obiect de răspuns valid?

Observatorul Padawan va observa până acum că nu există un obiect de răspuns returnat în această acțiune, despre care am susținut că era o cerință mai devreme în articol.

Răspunsul este un obiect care conține codul pe care doriți să-l afișați, codurile de serviciu, anteturile etc. De exemplu, dacă doriți să afișați o pagină "Hello World", veți face acest lucru:

 returnați un nou răspuns ("Hello World!", 200);

Dacă doriți să creați o pagină pentru un apel AJAX, se poate face astfel:

 returnează răspunsul nou (json_encode (array ('some_variable' => 'some value')), 200, array ('tip de conținut' => 'application / json'));

Dacă doriți să redirecționați utilizatorul, o puteți face cu ajutorul unui RedirectResponse obiect.

Notă: Puteți modifica întotdeauna răspunsul dvs. pentru a vă potrivi nevoilor dvs. - coduri de stare, anteturi și multe altele. Nimic nu este în afara limitelor.

În mod normal, dacă doriți să afișați o vizualizare pentru utilizator, ați reveni la un nou obiect de răspuns ca acesta:

 returnați $ this-> container-> get ('templating') -> renderResponse ('EPBlogBundle: Implicit: index.html.twig', array ('name' => $ name));

Aceasta este o scurtătură lungă care returnează un obiect de răspuns cu un șablon redat ca conținut. Din fericire, clasa de bază a controlerului, de la care se extinde controlerul nostru, are o mulțime de funcții de comenzi rapide. Putem folosi face() metoda de a ne salva ceva timp:

 returnați $ this-> render ('EPBlogBundle: Implicit: index.html.twig', array ('name' => $ name));

Aceasta este doar o scurtătură pentru prima metodă pe care am arătat-o ​​mai sus. Primul parametru este afișarea pentru afișare. Toate vederile noastre sunt în interiorul pachetului nostru Resurse / opinii /. Vizualizările sunt separate în directoare bazate pe controlerul responsabil pentru vizualizare. De aici convenția de numire Pachet: Controler: Vizualizare.

Vizualizarea planului de bază (șablonul principal al aplicației) se află în app / Resurse / opinii /. Din moment ce acest lucru nu este în nici un director Bundle și nici un controler este pur și simplu denumit :: base.html.twig. O vizualizare în pachetul dvs., care este plasată în directorul rădăcină de legături rădăcină, este denumită Bundle :: View.

 app / Resources / views / base.html.twig // :: base.html.twig src / BlogBundle / Resurse / views / someView.html.twig // EPBlogBundle :: someView.html.twig src / BlogBundle / Resurse / vizualizări /Default/index.html.twig // EPBlogBundle: Implicit: index.html.twig

Și în sfârșit, al doilea parametru al nostru face() funcția sunt variabilele pe care le dorim accesibile în vizualizarea noastră.

Templiing cu Twig

Twig este un motor de șablon construit de Sensiolabs - creatorii Simfoniei. Symfony vine împreună cu Twig, deși nu este o cerință să o folosești.

Twig dispune de o mulțime de funcționalități frumoase, care depășesc sfera de aplicare a acestui articol, dar nu ezitați să o verificați pe site-ul oficial Twig.

Dacă te deschizi EPBlogBundle: Implicit: index.html.twig veți vedea codul care arată astfel:

 Bună ziua name!

Twig folosește și %% ca etichete de început și de sfârșit. Plăcile duble curl înseamnă a scoate ceva, similar cu echivalentul PHP al lui . Asa de Nume înseamnă a scoate valoarea variabilei noastre numele $ (pe care i-am spus Symfony pe care am vrut să o folosim atunci când am creat obiectul de răspuns).

Pentru a vă oferi un mic eșantion de minunat al lui Twig, vă voi arăta câteva filtre. Un filtru este o funcție pe care o puteți aplica unei variabile. Este aplicată utilizând această sintaxă var | filtru. Aici sunt cateva exemple.

 nume | superior // returnează variabila în UPPERCASE nume | lungime // returnează lungimea variabilei name | url_encode // returnează versiunea codată a adresei URL a variabilei

Puteți vedea o listă completă de etichete, filtre și funcții la documentația oficială Twig. Ceea ce face cu adevărat Twig este că este de fapt foarte ușor să vă creați propriile filtre și funcții. Dar va trebui să așteptați un alt tutorial pentru mai multe informații despre Twig și extensibilitatea acestuia.


Concluzie

Acesta este sfârșitul călătoriei noastre magnifice - și o aventură!

Nu numai că am aflat despre structura Symfony și legături, dar și despre puterea rutelor și a controlorilor lor. Sprink this cu un pic de Twig și ai fost introdus la Simfonia! Voi reveni în curând cu mai multe tutoriale aprofundate despre subiecte mai specifice, cum ar fi managementul activelor cu Assetic și templating cu Twig. Vă mulțumim pentru lectură.

Cod