Konfigurer ruting i PHP-programmer Bruke Symfony Routing Component

I dag går vi gjennom komponenten Symfony Routing, som lar deg sette opp ruting i PHP-applikasjonene dine.

Hva er Symfony Routing Component?

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:

  • installasjon og konfigurasjon
  • hvordan å sette opp grunnruter
  • Slik laster du ruter fra YAML-filen
  • hvordan du bruker alt-i-ett-ruteren

Installasjon og konfigurering

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.

Konfigurer grunnruter

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.

  • Initialiser Rute objekt for hver av dine applikasjonsruter.
  • Legg til alle Rute gjenstander til RouteCollection gjenstand.
  • Initialiser RequestContext objekt som inneholder kontekstinformasjonen for nåværende forespørsel.
  • Initialiser UrlMatcher objekt ved å passere RouteCollection objekt og RequestContext gjenstand.

Initialiser ruteobjektet for ulike ruter

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.

Legg til alle ruteobjekter til RouteCollection-objektet

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.

Initialiser RequestContext Gjenstand

Deretter 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 ());

Initialiser UrlMatcher Gjenstand

Til 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.

Hvordan finne ruter

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.

Legg inn ruter fra YAML-filen

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.

Ruter YAML-fil

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] +'

En eksempelfil

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!