Astăzi, vom trece prin componenta Symfony Routing, care vă permite să configurați rutarea în aplicațiile dvs. PHP.
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:
Î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.
Î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.
Traseu
obiect pentru fiecare dintre căile dvs. de aplicare.Traseu
obiecte la RouteCollection
obiect.RequestContext
obiect care conține informațiile despre contextul solicitării curente.UrlMatcher
obiect prin trecerea lui RouteCollection
obiect și RequestContext
obiect.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.
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.
RequestContext
ObiectApoi, 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 ());
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.
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-.
Î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.
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] +“
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!