I dag går vi gjennom komponenten Symfony Routing, som lar deg sette opp ruting i PHP-applikasjonene dine.
Symfony Routing Component er en svært populær ruting komponent som er tilpasset av flere rammer og gir mye fleksibilitet hvis du ønsker å sette opp ruter i PHP-applikasjonen.
Hvis du har bygget et egendefinert PHP-program og ser etter et funksjonsrikt ruteflybibliotek, er Symfony Routing Component mer enn verdt en titt. Det lar deg også definere ruter for søknaden din i YAML-formatet.
Fra og med installasjon og konfigurasjon, går vi gjennom ekte eksempler for å demonstrere en rekke alternativer komponenten har for rutekonfigurasjon. I denne artikkelen lærer du:
I denne delen skal vi installere bibliotekene som kreves for å konfigurere ruting i PHP-applikasjonene dine. Jeg antar at du har installert Komponist i systemet ditt da vi trenger det for å installere de nødvendige bibliotekene som er tilgjengelige på Packagist.
Når du har installert Komponist, fortsett og installer kjerne-routing-komponenten ved hjelp av følgende kommando.
$ komponist krever symfoni / ruting
Selv om rutekomponenten selv er tilstrekkelig til å gi omfattende rutefunksjoner i søknaden din, vil vi fortsette og installere noen andre komponenter også for å gjøre livet enklere og berikke den eksisterende kjernevirksomheten.
Til å begynne med, fortsetter vi og installerer komponenten HttpFoundation, som gir et objektorientert omslag for PHP globale variabler og responsrelaterte funksjoner. Det sørger for at du ikke trenger tilgang til globale variabler som $ _GET
, $ _POST
og lignende direkte.
$ komponist krever symfony / http-foundation
Deretter, hvis du vil definere programruter i YAML-filen i stedet for PHP-koden, er det YAML-komponenten som kommer til redning, da den hjelper deg med å konvertere YAML-strenger til PHP-arrayer og omvendt.
$ komponist krever symfony / yaml
Til slutt vil vi installere Config-komponenten, som gir flere verktøysklasser å initialisere og håndtere konfigurasjonsverdier definert i de forskjellige filtyper som YAML, INI, XML, osv. I vårt tilfelle vil vi bruke den til å laste ruter fra YAML-filen.
$ komponent krever symfony / config
Så det er installasjonsdelen, men hvordan skal du bruke den? Faktisk er det bare et spørsmål om å inkludere autoload.php fil opprettet av Komponist i din søknad, som vist i følgende utdrag.
I den forrige delen gikk vi gjennom installasjonen av nødvendige rutingkomponenter. Nå er du klar til å sette opp ruting i din PHP-applikasjon med en gang.
La oss gå videre og opprette basic_routes.php fil med følgende innhold.
'FooController')); // Startrute med dynamiske plassholdere $ foo_placeholder_route = Ny rute ('/ foo / id', array ('controller' => 'FooController', 'method' => 'load' '[0-9] +')); // Legg til ruteobjekt (er) til RouteCollection-objekt $ ruter = ny RouteCollection (); $ ruter-> legg til ('foo_route', $ foo_route); $ ruter-> legg til ('foo_placeholder_route', $ foo_placeholder_route); // Init RequestContext objekt $ context = new RequestContext (); $ Kontekst> fromRequest (Request :: createFromGlobals ()); // Init UrlMatcher objekt $ matcher = ny UrlMatcher ($ ruter, $ kontekst); // Finn den nåværende ruten $ parameters = $ matcher-> match ($ kontekst-> getPathInfo ()); // Hvordan generere en SEO URL $ generator = ny UrlGenerator ($ ruter, $ kontekst); $ url = $ generator-> generere ('foo_placeholder_route', array ('id' => 123,)); ekko ''; print_r ($ parametre); ekko 'Generert URL:'. $ Url; exit; fangst (ResourceNotFoundException $ e) echo $ e-> getMessage ();Oppsett av ruting ved hjelp av Symfony Routing-komponenten går vanligvis gjennom en rekke trinn som beskrevet nedenfor.
Rute
objekt for hver av dine applikasjonsruter.Rute
gjenstander til RouteCollection
gjenstand.RequestContext
objekt som inneholder kontekstinformasjonen for nåværende forespørsel.UrlMatcher
objekt ved å passere RouteCollection
objekt og RequestContext
gjenstand.La oss gå videre og definere en ganske grunnleggende foo
rute.
$ foo_route = ny rute ('/ foo', array ('controller' => 'FooController'));
Det første argumentet til Rute
Konstruktøren er URI-banen, og det andre argumentet er et utvalg av egendefinerte attributter som du vil returnere når denne ruten er tilpasset. Vanligvis vil det være en kombinasjon av kontrolleren og metoden du vil ringe når denne ruten blir bedt om.
Deretter skal vi se på den parametrerte ruten.
$ foo_placeholder_route = ny rute ('/ foo / id', array ('controller' => 'FooController', 'metode' => 'last'), array ('id' => '[0-9] + '));
Ovennevnte rute kan samsvare med URIer som foo / 1
, foo / 123
og lignende. Vær oppmerksom på at vi har begrenset Id
parameter bare til numeriske verdier, og dermed stemmer det ikke med URIer som foo / bar
siden Id
parameteren er gitt som en streng.
Det neste trinnet er å legge til ruteobjekter som vi har initialisert i forrige seksjon til RouteCollection
gjenstand.
$ routes = ny RouteCollection (); $ ruter-> legg til ('foo_route', $ foo_route); $ ruter-> legg til ('foo_placeholder_route', $ foo_placeholder_route);
Som du kan se, er det ganske greit som du bare trenger å bruke Legg til
metode av RouteCollection
motsette seg å legge til ruteobjekter. Det første argumentet til Legg til
Metoden er navnet på ruten, og det andre argumentet er selve ruteobjektet.
RequestContext
GjenstandDeretter må vi initialisere RequestContext
objekt, som inneholder kontekstinformasjon for nåværende forespørsel. Vi trenger dette objektet når vi initialiserer UrlMatcher
objekt som vi vil gå gjennom det på et øyeblikk.
$ context = new RequestContext (); $ Kontekst> fromRequest (Request :: createFromGlobals ());
UrlMatcher
GjenstandTil slutt må vi initialisere UrlMatcher
objekt sammen med ruter og kontekstinformasjon.
// Init UrlMatcher objekt $ matcher = ny UrlMatcher ($ ruter, $ kontekst);
Nå har vi alt vi kan matche våre ruter mot.
Det er kamp
metode av UrlMatcher
objekt som lar deg matche hvilken som helst rute mot et sett med forhåndsdefinerte ruter.
De kamp
Metoden tar URI som første argument, og forsøker å matche den mot forhåndsdefinerte ruter. Hvis ruten er funnet, returnerer den egendefinerte attributter tilknyttet den ruten. På den annen side kaster den ResourceNotFoundException
unntak hvis det ikke er en rute tilknyttet den nåværende URI.
$ parametere = $ matcher-> match ($ kontekst-> getPathInfo ());
I vårt tilfelle har vi gitt den nåværende URI ved å hente den fra $ sammenheng
gjenstand. Så, hvis du åpner http: //your-domain/basic_routes.php/foo-URLen, $ Kontekst> getPathInfo ()
avkastning foo
, og vi har allerede definert en rute for foo
URI, så det bør returnere oss følgende.
Array ([controller] => FooController [_route] => foo_route)
Nå, la oss gå videre og teste den parametriserte ruten ved å gå til http: //your-domain/basic_routes.php/foo/123 URL.
Array ([controller] => FooController [metode] => last [id] => 123 [_route] => foo_placeholder_route)
Det virket hvis du kan se at id
parameteren er bundet med riktig verdi 123
.
La oss nå prøve å få tilgang til en ikke-eksisterende rute som http: //your-domain/basic_routes.php/unknown-route, og du bør se følgende melding.
Ingen ruter funnet for "/ ukjent rute".
Så det er hvordan du kan finne ruter ved hjelp av kamp
metode.
Bortsett fra dette, kan du også bruke routing
komponent for å generere linker i søknaden din. sørget for RouteCollection
og RequestContext
gjenstander, UrlGenerator
lar deg bygge lenker for bestemte ruter.
$ generator = ny UrlGenerator ($ ruter, $ kontekst); $ url = $ generator-> generere ('foo_placeholder_route', array ('id' => 123,));
Det første argumentet til generere
Metoden er rutens navn, og det andre argumentet er arrayet som kan inneholde parametere hvis det er parameterisert rute. Ovennevnte kode skal generere /basic_routes.php/foo/123 URL.
I den forrige delen bygget vi våre tilpassede ruter ved hjelp av Rute
og RouteCollection
objekter. Faktisk er det routing
komponenten tilbyr forskjellige måter du kan velge mellom for å instantiere ruter. Du kan velge mellom forskjellige lastere som YamlFileLoader
, XmlFileLoader
, og PhpFileLoader
.
I denne delen går vi gjennom YamlFileLoader
laster for å se hvordan du laster ruter fra YAML-filen.
Gå videre og opprett routes.yaml fil med følgende innhold.
foo_route: sti: / foo standard: controller: 'FooController :: indexAction' foo_placeholder_route: sti: / foo / id standard: controller: 'FooController :: loadAction' krav: id: '[0-9] +'
Deretter fortsett å gjøre load_routes_from_yaml.php fil med følgende innhold.
belastning ( 'routes.yaml'); // Init RequestContext objekt $ context = new RequestContext (); $ Kontekst> fromRequest (Request :: createFromGlobals ()); // Init UrlMatcher objekt $ matcher = ny UrlMatcher ($ ruter, $ kontekst); // Finn den nåværende ruten $ parameters = $ matcher-> match ($ kontekst-> getPathInfo ()); // Hvordan generere en SEO URL $ generator = ny UrlGenerator ($ ruter, $ kontekst); $ url = $ generator-> generere ('foo_placeholder_route', array ('id' => 123,)); ekko ''; print_r ($ parametre); ekko 'Generert URL:'. $ Url; exit; fangst (ResourceNotFoundException $ e) echo $ e-> getMessage ();Det eneste som er annerledes i dette tilfellet er måten vi initialiserer ruter på!
$ fileLocator = ny FileLocator (array (__ DIR__)); $ loader = ny YamlFileLoader ($ fileLocator); $ ruter = $ loader-> load ('routes.yaml');Vi har brukt
YamlFileLoader
laster å laste ruter fra routes.yaml fil i stedet for å initialisere den direkte i PHP selv. Bortsett fra det, er alt det samme og bør produsere de samme resultatene som basic_routes.php fil.Alt-i-ett-ruteren
Til slutt i denne delen går vi gjennom
Router
klassen, som lar deg sette opp ruting raskt med færre linjer med kode.Gå videre og gjør all_in_one_router.php fil med følgende innhold.
fromRequest (Request :: createFromGlobals ()); $ router = ny router (ny YamlFileLoader ($ fileLocator), 'routes.yaml', array ('cache_dir' => __DIR __. '/ cache'), $ requestContext); // Finn den nåværende ruten $ parameters = $ router-> match ($ requestContext-> getPathInfo ()); // Hvordan generere en SEO URL $ ruter = $ router-> getRouteCollection (); $ generator = ny UrlGenerator ($ ruter, $ requestContext); $ url = $ generator-> generere ('foo_placeholder_route', array ('id' => 123,)); ekko ''; print_r ($ parametre); ekko 'Generert URL:'. $ Url; exit; fangst (ResourceNotFoundException $ e) echo $ e-> getMessage ();Alt er ganske mye det samme, bortsett fra at vi har instansert
Router
objekt sammen med de nødvendige avhengighetene.$ router = ny router (ny YamlFileLoader ($ fileLocator), 'routes.yaml', array ('cache_dir' => __DIR __. '/ cache'), $ requestContext);Med det på plass, kan du straks bruke
kamp
metode for ruterobjektet for rutekartlegging.$ parametere = $ router-> match ($ requestContext-> getPathInfo ());Også, du må bruke
getRouteCollection
Metode for Router-objektet for å hente ruter.$ ruter = $ router-> getRouteCollection ();Konklusjon
Gå videre og undersøk de andre alternativene som er tilgjengelige i rutekomponenten - jeg vil gjerne høre tankene dine!
I dag utforsket vi komponenten Symfony Routing, som gjør implementering av ruting i PHP-programmer en bris. Underveis opprettet vi en håndfull eksempler for å demonstrere ulike aspekter av Routing-komponenten.
Jeg håper at du har hatt glede av denne artikkelen, og du er velkommen til å legge inn dine tanker ved å bruke feedet under!