Configurarea rutării în aplicațiile PHP Utilizând componenta Symfony Routing

Astăzi, vom trece prin componenta Symfony Routing, care vă permite să configurați rutarea în aplicațiile dvs. PHP.

Care este componenta Routing Symfony?

Componenta Symfony Routing este o componentă de rutare foarte populară care este adaptată de mai multe cadre și oferă o mulțime de flexibilitate dacă doriți să configurați rute în aplicația dvs. PHP.

Dacă ați construit o aplicație personalizată PHP și căutați o bibliotecă de rutare bogată în caracteristici, Componenta Symfony Routing este mai mult decât un aspect apreciat. De asemenea, vă permite să definiți rute pentru aplicația dvs. în format YAML.

Începând cu instalarea și configurarea, vom trece prin exemple din lumea reală pentru a demonstra o varietate de opțiuni pe care le are componenta pentru configurarea rutei. În acest articol, veți afla:

  • instalare și configurare
  • cum să configurați rute de bază
  • cum să încărcați rute din fișierul YAML
  • cum să utilizați routerul multifuncțional

Instalare și configurare

În această secțiune, vom instala bibliotecile necesare pentru a configura rutarea în aplicațiile dvs. PHP. Presupun că ați instalat Compozitor în sistemul dvs., deoarece vom avea nevoie de el pentru a instala bibliotecile necesare care sunt disponibile pe ambalator.

Odată ce ați instalat Compozitor, continuați și instalați componenta Core Routing utilizând următoarea comandă.

$ compozitorul necesită simfonie / rutare

Deși componenta Routing în sine este suficientă pentru a oferi caracteristici de rutare complexe în aplicația dvs., vom continua și vom instala și alte câteva componente, pentru a ne ușura viața și a îmbogăți funcționalitatea de rutare existentă.

Pentru început, vom continua și vom instala componenta HttpFoundation, care oferă un wrapper orientat pe obiecte pentru variabilele globale PHP și funcțiile legate de răspuns. Se asigură că nu aveți nevoie să accesați variabile globale cum ar fi $ _GET, $ _POST și așa mai departe.

$ compozitorul necesită symfony / http-foundation

În continuare, dacă doriți să definiți rutele aplicației în fișierul YAML în locul codului PHP, este componenta YAML care vine la salvare, deoarece vă ajută să convertiți șiruri de caractere YAML în rețele PHP și invers.

$ compozitorul necesită simfony / yaml

În cele din urmă, vom instala componenta Config, care oferă mai multe clase de utilități pentru a inițializa și rezolva valorile de configurare definite în diferite tipuri de fișiere, cum ar fi YAML, INI, XML, etc. În cazul nostru, îl vom folosi pentru a încărca rutele din fișierul YAML.

$ compozitorul necesită simfony / config

Deci asta este partea de instalare, dar cum ar trebui să o folosești? De fapt, este doar o chestiune de a include autoload.php fișier creat de Compozitor în aplicația dvs., așa cum se arată în fragmentul următor.

Configurați rutele de bază

În secțiunea anterioară am trecut prin instalarea componentelor de rutare necesare. Acum, sunteți gata să configurați rutarea în aplicația dvs. PHP imediat.

Să mergem mai departe și să creăm basic_routes.php fișier cu următorul conținut.

 "FooController")); // rută init cu locașuri dinamice $ foo_placeholder_route = nouă rută ('/ foo / id', array ('controller' => 'FooController', ' '[0-9] +')); // Adăugarea obiectelor de rută la obiectul RouteCollection $ routes = new RouteCollection (); $ rute-> adăugați ('foo_route', $ foo_route); $ rute-> adăugați ('foo_placeholder_route', $ foo_placeholder_route); // Obiect Init RequestContext $ context = nou RequestContext (); $ Contextuale> fromRequest (Request :: createFromGlobals ()); // obiect Init UrlMatcher $ matcher = nou UrlMatcher ($ trasee, $ context); // găsiți ruta curentă $ parameters = $ matcher-> match ($ context-> getPathInfo ()); // Cum se generează un URL generator SEO $ generator = UrlGenerator nou ($ rute, $ context); $ url = $ generator-> generează ('foo_placeholder_route', array ('id' => 123,)); echo "
„; print_r ($ parametri); ecou "URL generat:". URL-ul $; Ieșire;  captură (ResourceNotFoundException $ e) echo $ e-> getMessage (); 

Configurarea rutei utilizând componenta Symfony Routing rulează de obicei printr-o serie de pași, așa cum sunt enumerați mai jos.

  • Inițializați Traseu obiect pentru fiecare dintre căile dvs. de aplicare.
  • Adaugă totul Traseu obiecte la RouteCollection obiect.
  • Inițializați RequestContext obiect care conține informațiile despre contextul solicitării curente.
  • Inițializați UrlMatcher obiect prin trecerea lui RouteCollection obiect și RequestContext obiect.

Inițializați obiectul traseului pentru diferite rute

Să mergem mai departe și să definim o bază destul de simplă foo traseu.

$ foo_route = Traseu nou ('/ foo', array ('controller' => 'FooController'));

Primul argument al Traseu constructorul este calea URI, iar al doilea argument este matricea atributelor personalizate pe care doriți să le reveniți atunci când acest traseu este adaptat. În mod normal, ar fi o combinație a regulatorului și a metodei pe care doriți să o apelați atunci când se solicită acest traseu.

Apoi, să aruncăm o privire la ruta parametrizată.

$ foo_placeholder_route = Traseu nou ('/ foo / id', array ('controller' => 'FooController', 'method' => '));

Ruta de mai sus poate fi identică cu URI foo / 1, foo / 123 și altele similare. Rețineți că am restricționat Id parametru numai pentru valorile numerice și, prin urmare, nu se va potrivi cu URI foo / bar din moment ce Id parametru este furnizat ca un șir.

Adăugați toate obiectele de rută la obiectul RouteCollection

Următorul pas este să adăugăm obiecte de rută pe care le-am inițializat în secțiunea anterioară la RouteCollection obiect.

$ route = nouă RouteCollection (); $ rute-> adăugați ('foo_route', $ foo_route); $ rute-> adăugați ('foo_placeholder_route', $ foo_placeholder_route);

După cum puteți vedea, este destul de simplă pe cât trebuie să folosiți adăuga metodă a RouteCollection obiect pentru a adăuga obiecte de traseu. Primul argument al adăuga metoda este numele traseului, iar al doilea argument este obiectul traseu în sine.

Inițializați RequestContext Obiect

Apoi, trebuie să inițializăm RequestContext obiect, care conține informații despre contextul solicitării actuale. Avem nevoie de acest obiect atunci când inițializăm UrlMatcher obiect cum vom trece printr-o clipă.

$ context = nou RequestContext (); $ Contextuale> fromRequest (Request :: createFromGlobals ());

Inițializați UrlMatcher Obiect

În cele din urmă, trebuie să inițializăm UrlMatcher obiect împreună cu rute și informații de context.

// obiect Init UrlMatcher $ matcher = nou UrlMatcher ($ trasee, $ context);

Acum, avem tot ce ne-am putea potrivi cu traseele noastre.

Cum se potrivesc traseelor

Este vorba de Meci metodă a UrlMatcher obiect care vă permite să potriviți orice traseu cu un set de rute predefinite.

Meci metoda ia URI ca primul său argument și încearcă să se potrivească cu acesta pe rute predefinite. Dacă traseul este găsit, acesta returnează atributele personalizate asociate acelui traseu. Pe de altă parte, aruncă ResourceNotFoundException excepție dacă nu există niciun trase asociat cu URI curent.

$ parametri = $ matcher-> potrivire ($ context-> getPathInfo ());

În cazul nostru, am furnizat URI-ul curent, prin preluarea acestuia de la $ context obiect. Deci, dacă accesați http: //your-domain/basic_routes.php/foo URL, $ Contextuale> getPathInfo () se intoarce foo, și am definit deja o rută pentru foo URI, deci ar trebui să ne întoarcă următoarele.

Array ([controler] => FooController [_route] => foo_route)

Acum, hai să mergem înainte și să testați ruta parametrizată accesând http: //your-domain/basic_routes.php/foo/123 URL.

Array ([controller] => FooController [method] => încărcare [id] => 123 [_route] => foo_placeholder_route)

A funcționat dacă puteți vedea că id parametrul este legat de valoarea corespunzătoare 123.

Apoi, să încercăm să accesăm o rută inexistentă precum http: //your-domain/basic_routes.php/unknown-route și ar trebui să vedeți următorul mesaj.

Nu au fost găsite trase pentru "/ unknown-route".

Deci, așa puteți găsi rute folosind Meci metodă.

În afară de aceasta, puteți utiliza și Routing componentă pentru a genera linkuri în aplicația dvs. prevăzut RouteCollection și RequestContext obiecte, UrlGenerator vă permite să construiți linkuri pentru rute specifice.

$ generator = noul UrlGenerator (rute $, context $); $ url = $ generator-> generează ('foo_placeholder_route', array ('id' => 123,));

Primul argument al Genera metoda este numele traseului, iar al doilea argument este matricea care poate conține parametri dacă este ruta parametrizată. Codul de mai sus ar trebui să genereze /basic_routes.php/foo/123 URL-.

Încărcați rută din fișierul YAML

În secțiunea anterioară, am construit rutele noastre personalizate folosind Traseu și RouteCollection obiecte. De fapt, Routing Componenta oferă diferite modalități de alegere pentru a instanțializa rutele. Ați putea alege dintre diferite tipuri de încărcătoare YamlFileLoader, XmlFileLoader, și PhpFileLoader.

În această secțiune, vom trece prin YamlFileLoader încărcător pentru a vedea cum se pot încărca rute din fișierul YAML.

Fișierul YAML Routes

Continuați și creați routes.yaml fișier cu următorul conținut.

foo_route: path: / foo implicit: controler: 'FooController :: indexAction' foo_placeholder_route: path: / foo / id implicit: controller: 'FooController :: loadAction' cerințe: id: '[0-9] +“

Un exemplu de fișier

Apoi, continuați și faceți load_routes_from_yaml.php fișier cu următorul conținut.

încărcare ( 'routes.yaml'); // Obiect Init RequestContext $ context = nou RequestContext (); $ Contextuale> fromRequest (Request :: createFromGlobals ()); // obiect Init UrlMatcher $ matcher = nou UrlMatcher ($ trasee, $ context); // găsiți ruta curentă $ parameters = $ matcher-> match ($ context-> getPathInfo ()); // Cum se generează un URL generator SEO $ generator = UrlGenerator nou ($ rute, $ context); $ url = $ generator-> generează ('foo_placeholder_route', array ('id' => 123,)); echo "
„; print_r ($ parametri); ecou "URL generat:". URL-ul $; Ieșire;  captură (ResourceNotFoundException $ e) echo $ e-> getMessage (); 

Singurul lucru diferit în acest caz este modul în care inițializăm rutele!

$ fileLocator = noul FileLocator (array (__ DIR__)); $ loader = noul YamlFileLoader ($ fileLocator); $ rută = $ încărcător-> încărcare ('routes.yaml');

Am folosit-o YamlFileLoader încărcător pentru a încărca rute de la routes.yaml fișier în loc să îl inițializați direct în PHP în sine. În afară de aceasta, totul este același și ar trebui să producă aceleași rezultate ca și cele ale basic_routes.php fişier.

Routerul All-in-One

În cele din urmă în această secțiune, vom trece prin Router clasa, care vă permite să configurați rutarea rapid cu mai puține linii de cod.

Du-te și fă-o all_in_one_router.php fișier cu următorul conținut.

fromRequest (Request :: createFromGlobals ()); $ router = router nou (noul YamlFileLoader ($ fileLocator), 'routes.yaml', array ('cache_dir' => __DIR __. / cache '), $ requestContext); // găsiți ruta curentă $ parameters = $ router-> match ($ requestContext-> getPathInfo ()); // Cum se generează o adresă URL SEO $ routes = $ router-> getRouteCollection (); $ generator = noul UrlGenerator ($ trasee, $ requestContext); $ url = $ generator-> generează ('foo_placeholder_route', array ('id' => 123,)); echo "
„; print_r ($ parametri); ecou "URL generat:". URL-ul $; Ieșire;  captură (ResourceNotFoundException $ e) echo $ e-> getMessage (); 

Totul este cam la fel, cu excepția faptului că am instanțiat-o Router obiect împreună cu dependențele necesare.

$ router = router nou (noul YamlFileLoader ($ fileLocator), 'routes.yaml', array ('cache_dir' => __DIR __. / cache '), $ requestContext);

Cu asta, puteți folosi imediat Meci metoda obiectului Router pentru cartografierea rutei.

$ parametri = $ router-> match ($ requestContext-> getPathInfo ());

De asemenea, va trebui să utilizați getRouteCollection metoda obiectului Router pentru a prelua traseele.

$ rute = $ router-> getRouteCollection ();

Concluzie

Mergeți și explorați celelalte opțiuni disponibile în componenta Routing - mi-ar plăcea să vă aud gândurile!

Astăzi, am explorat componenta Symfony Routing, care face ca implementarea rutei în aplicațiile PHP să fie o briză. Pe parcurs, am creat o serie de exemple pentru a demonstra diferite aspecte ale componentei Routing. 

Sper că te-ai bucurat de acest articol și te simți liber să postezi gândurile tale folosind feedul de mai jos!

Cod