Idag går vi igenom komponenten Symfony Routing, som gör att du kan konfigurera routing i dina PHP-applikationer.
Symfony Routing Component är en mycket populär routing komponent som anpassas av flera ramar och ger mycket flexibilitet om du vill skapa rutor i din PHP-applikation.
Om du har byggt en anpassad PHP-applikation och letar efter ett funktionsrikt routing-bibliotek, är Symfony Routing Component mer än en värt att se. Det låter dig också definiera rutter för din ansökan i YAML-formatet.
Från och med installationen och konfigurationen går vi igenom exemplar i verkligheten för att visa en rad olika alternativ som komponenten har för rutekonfiguration. I den här artikeln lär du dig:
I det här avsnittet ska vi installera de bibliotek som krävs för att konfigurera routing i dina PHP-applikationer. Jag antar att du har installerat Composer i ditt system, eftersom vi behöver det för att installera de nödvändiga bibliotek som finns på Packagist.
När du har installerat Composer, fortsätt och installera core Routing-komponenten med följande kommando.
$ komponent kräver symfoni / routing
Även om routing-komponenten i sig är tillräcklig för att tillhandahålla omfattande routingsfunktioner i din ansökan, kommer vi att fortsätta och installera några andra komponenter också för att göra vårt liv enklare och berika den befintliga core routingfunktionaliteten.
Till att börja med kommer vi att fortsätta och installera komponenten HttpFoundation, som ger ett objektorienterat omslag för PHP-globala variabler och responsrelaterade funktioner. Det gör att du inte behöver tillgång till globala variabler som $ _GET
, $ _POST
och liknande direkt.
$ komponent kräver symfony / http-foundation
Om du vill definiera dina applikationsvägar i YAML-filen istället för PHP-koden är det YAML-komponenten som kommer till räddning, eftersom det hjälper dig att konvertera YAML-strängar till PHP-arrayer och vice versa.
$ komponist kräver symfoni / yaml
Slutligen installerar vi Config-komponenten, som ger flera verktygsklasser att initiera och hantera konfigurationsvärden som definieras i olika typer av filer som YAML, INI, XML, etc. I vårt fall använder vi det för att ladda vägar från YAML-filen.
$ komponent kräver symfony / config
Så det är installationsdelen, men hur ska du använda den? Faktum är att det bara handlar om att inkludera autoload.php fil skapad av kompositören i din ansökan, som visas i följande kod.
I det föregående avsnittet gick vi igenom installationen av nödvändiga routing-komponenter. Nu är du redo att konfigurera routing i din PHP-applikation direkt.
Låt oss fortsätta och skapa basic_routes.php fil med följande innehåll.
"FooController")); // Init-rutt med dynamiska platshållare $ foo_placeholder_route = Ny rutt ('/ foo / id', array ('controller' => 'FooController', 'method' => 'load' '[0-9] +')); // Lägg till Ruttobjekt (er) till RouteCollection-objekt $ routes = Ny RouteCollection (); $ routes-> lägg till ('foo_route', $ foo_route); $ routes-> lägg till ('foo_placeholder_route', $ foo_placeholder_route); // Init RequestContext objekt $ context = new RequestContext (); $ Sammanhangs> fromRequest (Request :: createFromGlobals ()); // Init UrlMatcher objekt $ matcher = ny UrlMatcher ($ rutter, $ kontext); // Hitta den aktuella rutten $ parameters = $ matcher-> match ($ context-> getPathInfo ()); // Hur genererar en SEO URL $ generator = ny UrlGenerator ($ rutter, $ context); $ url = $ generator-> generera ('foo_placeholder_route', array ('id' => 123,)); eko "'; print_r ($ parametrar); echo 'Genererad URL:'. $ Url; utgång; fånga (ResourceNotFoundException $ e) echo $ e-> getMessage ();Konfigurering av routning med hjälp av Symfony Routing-komponenten går vanligen genom en rad steg som anges nedan.
Rutt
objekt för var och en av dina ansökningsvägar.Rutt
objekt till RouteCollection
objekt.RequestContext
objekt som innehåller den aktuella begäran om sammanhangsinformation.UrlMatcher
objekt genom att passera RouteCollection
objekt och RequestContext
objekt.Låt oss gå vidare och definiera en ganska grundläggande foo
rutt.
$ foo_route = ny rutt ('/ foo', array ('controller' => 'FooController'));
Det första argumentet från Rutt
konstruktorn är URI-sökvägen, och det andra argumentet är en rad anpassade attribut som du vill återvända när den här vägen matchas. Vanligtvis skulle det vara en kombination av den kontroller och metod som du vill ringa när den här vägen begärs.
Låt oss nu titta på den parametrerade rutten.
$ foo_placeholder_route = ny rutt ('/ foo / id', array ('controller' => 'FooController', 'method' => 'ladda'), array ('id' => '[0-9] + '));
Ovanstående rutt kan matcha URI: er som foo / 1
, foo / 123
och liknande. Observera att vi har begränsat Id
parameter till numeriska värden bara, och det kommer därför inte att matcha URI-filer som Foo bar
sedan Id
parametern tillhandahålls som en sträng.
Nästa steg är att lägga till rutobjekt som vi har initierat i föregående avsnitt till RouteCollection
objekt.
$ routes = ny RouteCollection (); $ routes-> lägg till ('foo_route', $ foo_route); $ routes-> lägg till ('foo_placeholder_route', $ foo_placeholder_route);
Som du kan se är det ganska enkelt eftersom du bara behöver använda Lägg till
metod för RouteCollection
motsätta sig att lägga till ruttobjekt. Det första argumentet från Lägg till
Metoden är namnet på rutten, och det andra argumentet är själva rutinobjektet.
RequestContext
ObjektDärefter måste vi initiera RequestContext
objekt som innehåller den aktuella förfrågningstextinformationen. Vi behöver detta objekt när vi initierar UrlMatcher
objekt som vi kommer att gå igenom det på ett ögonblick.
$ context = new RequestContext (); $ Sammanhangs> fromRequest (Request :: createFromGlobals ());
UrlMatcher
ObjektSlutligen måste vi initiera UrlMatcher
objekt tillsammans med rutter och kontextinformation.
// Init UrlMatcher objekt $ matcher = ny UrlMatcher ($ rutter, $ kontext);
Nu har vi allt vi kan matcha våra vägar mot.
Det är match
metod för UrlMatcher
objekt som låter dig matcha vilken rutt som helst mot en uppsättning fördefinierade rutter.
De match
Metoden tar URI som första argument och försöker matcha det mot fördefinierade rutter. Om rutten hittas returnerar den anpassade attribut som är associerade med den rutten. Å andra sidan kastar den ResourceNotFoundException
undantag om det inte finns någon rutt som är associerad med den aktuella URI.
$ parametrar = $ matcher-> match ($ context-> getPathInfo ());
I vårt fall har vi gett den aktuella URI-enheten genom att hämta den från $ sammanhang
objekt. Så, om du använder http: //your-domain/basic_routes.php/foo URL $ Sammanhangs> getPathInfo ()
avkastning foo
, och vi har redan definierat en rutt för foo
URI, så det borde returnera oss följande.
Array ([controller] => FooController [_route] => foo_route)
Nu, låt oss fortsätta och testa den parametrerade rutten genom att öppna http: //your-domain/basic_routes.php/foo/123 URL.
Array ([controller] => FooController [method] => ladda [id] => 123 [_route] => foo_placeholder_route)
Det fungerade om du kan se att id
parametern är bunden med lämpligt värde 123
.
Låt oss sedan försöka få tillgång till en existerande väg som http: //your-domain/basic_routes.php/unknown-route, och du borde se följande meddelande.
Inga rutter hittades för "/ okänd rutt".
Så det är så du kan hitta rutter med hjälp av match
metod.
Bortsett från detta kan du också använda routing
komponent för att generera länkar i din ansökan. Försedd RouteCollection
och RequestContext
objekt, UrlGenerator
låter dig bygga länkar för specifika rutter.
$ generator = ny UrlGenerator ($ rutter, $ kontext); $ url = $ generator-> generera ('foo_placeholder_route', array ('id' => 123,));
Det första argumentet från generera
Metoden är rutens namn och det andra argumentet är den matris som kan innehålla parametrar om det är den parametrerade rutten. Ovanstående kod ska generera /basic_routes.php/foo/123 URL.
I det föregående avsnittet byggde vi våra anpassade rutter med hjälp av Rutt
och RouteCollection
objekt. Faktum är att routing
Komponenten erbjuder olika sätt att välja mellan för att omedelbara vägar. Du kan välja bland olika lastare som YamlFileLoader
, XmlFileLoader
, och PhpFileLoader
.
I det här avsnittet går vi igenom YamlFileLoader
lastare för att se hur man laddar rutter från YAML-filen.
Gå vidare och skapa routes.yaml fil med följande innehåll.
foo_route: path: / foo default: controller: 'FooController :: indexAction' foo_placeholder_route: sökväg: / foo / id standard: controller: 'FooController :: loadAction' krav: id: '[0-9] +'
Fortsätt sedan och gör load_routes_from_yaml.php fil med följande innehåll.
belastning ( 'routes.yaml'); // Init RequestContext objekt $ context = new RequestContext (); $ Sammanhangs> fromRequest (Request :: createFromGlobals ()); // Init UrlMatcher objekt $ matcher = ny UrlMatcher ($ rutter, $ kontext); // Hitta den aktuella rutten $ parameters = $ matcher-> match ($ context-> getPathInfo ()); // Hur genererar en SEO URL $ generator = ny UrlGenerator ($ rutter, $ context); $ url = $ generator-> generera ('foo_placeholder_route', array ('id' => 123,)); eko "'; print_r ($ parametrar); echo 'Genererad URL:'. $ Url; utgång; fånga (ResourceNotFoundException $ e) echo $ e-> getMessage ();Det enda som är annorlunda i detta fall är hur vi initierar rutter!
$ fileLocator = ny FileLocator (array (__ DIR__)); $ loader = ny YamlFileLoader ($ fileLocator); $ routes = $ loader-> load ('routes.yaml');Vi har använt
YamlFileLoader
lastare att lasta vägar från routes.yaml fil istället för att initiera den direkt i själva PHP. Bortsett från det är allt detsamma och borde det producera samma resultat som den basic_routes.php fil.Allt-i-ett-routern
Slutligen i det här avsnittet går vi igenom
router
klassen, som gör att du snabbt kan konfigurera routing med färre linjer kod.Fortsätt och gör all_in_one_router.php fil med följande innehåll.
fromRequest (Request :: createFromGlobals ()); $ router = ny router (ny YamlFileLoader ($ fileLocator), 'routes.yaml', array ('cache_dir' => __DIR __. '/ cache'), $ requestContext); // Hitta den aktuella rutten $ parameters = $ router-> match ($ requestContext-> getPathInfo ()); // Hur man genererar en SEO URL $ routes = $ router-> getRouteCollection (); $ generator = ny UrlGenerator ($ rutter, $ requestContext); $ url = $ generator-> generera ('foo_placeholder_route', array ('id' => 123,)); eko "'; print_r ($ parametrar); echo 'Genererad URL:'. $ Url; utgång; fånga (ResourceNotFoundException $ e) echo $ e-> getMessage ();Allt är ungefär detsamma, förutom att vi har instanserat
router
objekt tillsammans med nödvändiga beroenden.$ router = ny router (ny YamlFileLoader ($ fileLocator), 'routes.yaml', array ('cache_dir' => __DIR __. '/ cache'), $ requestContext);Med det på plats kan du genast använda
match
Metod för routerns objekt för rutekartläggning.$ parametrar = $ router-> match ($ requestContext-> getPathInfo ());Du måste också använda
getRouteCollection
Metoden för routerns objekt att hämta rutter.$ routes = $ router-> getRouteCollection ();Slutsats
Gå vidare och utforska de andra alternativen som finns i routing-komponenten-jag skulle gärna höra dina tankar!
Idag utforskade vi komponenten Symfony Routing, vilket gör genomförandet av routing i PHP-applikationer en bris. Under tiden skapade vi en handfull exempel för att visa olika aspekter av Routing-komponenten.
Jag hoppas att du har haft den här artikeln, och gärna skicka dina tankar med hjälp av flödet nedan!