Routering instellen in PHP-toepassingen met behulp van de Symfony-routercomponent

Vandaag gaan we door het Symfony Routing-onderdeel, waarmee u routering in uw PHP-applicaties kunt instellen.

Wat is de Symfony-routercomponent?

Het Symfony Routing Component is een erg populaire routingcomponent die door verschillende frameworks is aangepast en veel flexibiliteit biedt als u routes in uw PHP-applicatie wilt instellen.

Als u een aangepaste PHP-applicatie hebt gebouwd en op zoek bent naar een rijk gevulde routeringsbibliotheek, is de Symfony Routing Component meer dan een kijkje waard. Hiermee kunt u ook routes voor uw toepassing in de YAML-indeling definiëren.

Beginnend met de installatie en configuratie, zullen we praktijkvoorbeelden doornemen om een ​​verscheidenheid aan opties te demonstreren die de component heeft voor routeconfiguratie. In dit artikel leer je:

  • installatie en configuratie
  • hoe u basisroutes kunt instellen
  • hoe routes uit het YAML-bestand te laden
  • hoe de all-in-one router te gebruiken

Installatie en configuratie

In deze sectie gaan we de bibliotheken installeren die nodig zijn om routering in uw PHP-applicaties in te stellen. Ik ga ervan uit dat u Composer in uw systeem hebt geïnstalleerd, omdat we het nodig hebben om de benodigde bibliotheken die beschikbaar zijn op Packagist te installeren.

Nadat u Composer hebt geïnstalleerd, kunt u doorgaan en de kernrouteringscomponent installeren met behulp van de volgende opdracht.

$ componist vereist symfony / routing

Hoewel de Routing-component zelf voldoende is om uitgebreide routeringsfuncties in uw toepassing te bieden, zullen we ook enkele andere componenten installeren om ons leven gemakkelijker te maken en de bestaande kernroutefunctionaliteit te verrijken.

Om te beginnen gaan we door met het installeren van de component HttpFoundation, die een object-georiënteerde wrapping biedt voor algemene PHP-variabelen en responsgerelateerde functies. Het zorgt ervoor dat u geen toegang hoeft te hebben tot globale variabelen zoals $ _GET, $ _POST en dergelijke direct.

$ composer vereist symfony / http-foundation

Als u vervolgens uw toepassingsroutes in het YAML-bestand wilt definiëren in plaats van de PHP-code, is het de YAML-component die u te hulp komt, omdat het u helpt YAML-reeksen naar PHP-arrays te converteren en omgekeerd.

$ componist vereist symfony / yaml

Ten slotte installeren we de Config-component, die verschillende hulpprogramma-klassen biedt om te initialiseren en om te gaan met configuratiewaarden die zijn gedefinieerd in de verschillende soorten bestanden, zoals YAML, INI, XML, enz. In dit geval gebruiken we deze om routes te laden van het YAML-bestand.

$ composer vereist symfony / config

Dus dat is het installatiedeel, maar hoe moet je het gebruiken? In feite is het gewoon een kwestie van het opnemen van de autoload.php bestand gemaakt door Composer in uw toepassing, zoals getoond in het volgende fragment.

Basisroutebeschrijvingen instellen

In het vorige gedeelte hebben we de installatie van de benodigde routeringscomponenten doorgenomen. Nu bent u klaar om direct routering in uw PHP-applicatie in te stellen.

Laten we doorgaan en het maken basic_routes.php bestand met de volgende inhoud.

 'FooController')); // Init route met dynamische placeholders $ foo_placeholder_route = nieuwe Route ('/ foo / id', array ('controller' => 'FooController', 'method' => 'load'), array ('id' => '[0-9] +')); // Route-object (en) toevoegen aan RouteCollection-object $ routes = nieuwe RouteCollection (); $ routes-> toevoegen ('foo_route', $ foo_route); $ routes-> toevoegen ('foo_placeholder_route', $ foo_placeholder_route); // Init VerzoekContext-object $ context = nieuwe RequestContext (); $ Context-> fromRequest (Request :: createFromGlobals ()); // Init UrlMatcher-object $ matcher = nieuwe UrlMatcher ($ routes, $ context); // Zoek de huidige route $ parameters = $ matcher-> match ($ context-> getPathInfo ()); // Hoe een SEO URL te genereren $ generator = nieuwe UrlGenerator ($ routes, $ context); $ url = $ generator-> genereren ('foo_placeholder_route', array ('id' => 123,)); echo '
'; print_r ($ parameters); echo 'Gegenereerde URL:'. $ Url; Uitgang;  catch (ResourceNotFoundException $ e) echo $ e-> getMessage (); 

Het instellen van routering met behulp van de Symfony Routing-component gaat meestal via een aantal stappen zoals hieronder vermeld.

  • Initialiseer de Route object voor elk van uw toepassingsroutes.
  • Voeg alles toe Route objecten voor de RouteCollection voorwerp.
  • Initialiseer de RequestContext object dat de huidige contextinformatie van het verzoek bevat.
  • Initialiseer de UrlMatcher object door de RouteCollection object en de RequestContext voorwerp.

Initialiseer het route-object voor verschillende routes

Laten we doorgaan en een vrij basic definiëren foo route.

$ foo_route = nieuwe route ('/ foo', array ('controller' => 'FooController'));

Het eerste argument van de Route constructor is het URI-pad en het tweede argument is de array met aangepaste kenmerken die u wilt retourneren wanneer deze specifieke route wordt vergeleken. Doorgaans zou het een combinatie zijn van de controller en de methode die u zou willen aanroepen wanneer om deze route wordt gevraagd.

Laten we vervolgens de geparametriseerde route bekijken.

$ foo_placeholder_route = nieuwe route ('/ foo / id', array ('controller' => 'FooController', 'method' => 'load'), array ('id' => '[0-9] + '));

De bovenstaande route kan overeenkomen met URI's zoals foo / 1, foo / 123 en vergelijkbaar. Houd er rekening mee dat we de ID kaart parameter alleen naar numerieke waarden, en daarom komt het niet overeen met URI's zoals foo / bar sinds de ID kaart parameter wordt geleverd als een tekenreeks.

Voeg alle route-objecten toe aan het RouteCollection-object

De volgende stap is om routevoorwerpen toe te voegen die we in de vorige sectie hebben geïnitialiseerd RouteCollection voorwerp.

$ routes = nieuwe RouteCollection (); $ routes-> toevoegen ('foo_route', $ foo_route); $ routes-> toevoegen ('foo_placeholder_route', $ foo_placeholder_route);

Zoals u kunt zien, is het vrij eenvoudig omdat u alleen de toevoegen methode van de RouteCollection object om routevoorwerpen toe te voegen. Het eerste argument van de toevoegen methode is de naam van de route en het tweede argument is het route-object zelf.

Initialiseer de RequestContext Voorwerp

Vervolgens moeten we de RequestContext object, dat de huidige contextinformatie van het verzoek bevat. We hebben dit object nodig wanneer we het initialiseren UrlMatcher voorwerp, we zullen er even doorheen gaan.

$ context = nieuwe RequestContext (); $ Context-> fromRequest (Request :: createFromGlobals ());

Initialiseer de UrlMatcher Voorwerp

Ten slotte moeten we het UrlMatcher object samen met routes en contextinformatie.

// Init UrlMatcher-object $ matcher = nieuwe UrlMatcher ($ routes, $ context);

Nu hebben we alles waarmee we onze routes kunnen vergelijken.

Routes matchen

Het is de wedstrijd methode van de UrlMatcher object waarmee u elke route kunt vergelijken met een reeks vooraf gedefinieerde routes.

De wedstrijd methode neemt de URI als eerste argument en probeert deze aan te passen aan vooraf gedefinieerde routes. Als de route wordt gevonden, worden aangepaste kenmerken geretourneerd die aan die route zijn gekoppeld. Aan de andere kant gooit het de ResourceNotFoundException uitzondering als er geen route is gekoppeld aan de huidige URI.

$ parameters = $ matcher-> match ($ context-> getPathInfo ());

In ons geval hebben we de huidige URI geleverd door deze van de. Te halen $ context voorwerp. Dus als u de http: //uw-domein/basic_routes.php/foo-URL opent, is de $ Context-> getPathInfo () komt terug foo, en we hebben al een route gedefinieerd voor de foo URI, dus het zou ons het volgende moeten teruggeven.

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

Laten we nu de geparametriseerde route testen door naar de http: //uw-domein/basic_routes.php/foo/123 URL te gaan.

Array ([controller] => FooController [methode] => laad [id] => 123 [_route] => foo_placeholder_route)

Het werkte als je kunt zien dat het ID kaart parameter is gebonden met de juiste waarde 123.

Laten we vervolgens proberen toegang te krijgen tot een niet-bestaande route zoals http: //uw-domein/basic_routes.php/unknown-route, en je zou het volgende bericht moeten zien.

Geen routes gevonden voor "/ onbekende route".

Dus dat is hoe je routes kunt vinden met behulp van de wedstrijd methode.

Afgezien hiervan kunt u ook de routing component om links in uw applicatie te genereren. Mits RouteCollection en RequestContext objecten, de UrlGenerator kunt u links voor specifieke routes bouwen.

$ generator = nieuwe UrlGenerator ($ routes, $ context); $ url = $ generator-> genereren ('foo_placeholder_route', array ('id' => 123,));

Het eerste argument van de voortbrengen methode is de routenaam en het tweede argument is de array die mogelijk parameters bevat als het de geparametriseerde route is. De bovenstaande code zou het moeten genereren /basic_routes.php/foo/123 URL.

Laad routes vanuit het YAML-bestand

In het vorige gedeelte hebben we onze aangepaste routes gebouwd met behulp van de Route en RouteCollection voorwerpen. In feite is de routing component biedt verschillende manieren waarop u kunt kiezen om routes te instantiëren. Je kunt kiezen uit verschillende laders zoals YamlFileLoader, XmlFileLoader, en PhpFileLoader.

In dit gedeelte gaan we door de YamlFileLoader loader om te zien hoe routes uit het YAML-bestand worden geladen.

Het YAML-bestand met routes

Ga je gang en maak de routes.yaml bestand met de volgende inhoud.

foo_route: path: / foo standaardwaarden: controller: 'FooController :: indexAction' foo_placeholder_route: path: / foo / id standaardinstellingen: controller: 'FooController :: loadAction' vereisten: id: '[0-9] +'

Een voorbeeldbestand

Ga vervolgens door en maak het load_routes_from_yaml.php bestand met de volgende inhoud.

load (routes.yaml); // Init VerzoekContext-object $ context = nieuwe RequestContext (); $ Context-> fromRequest (Request :: createFromGlobals ()); // Init UrlMatcher-object $ matcher = nieuwe UrlMatcher ($ routes, $ context); // Zoek de huidige route $ parameters = $ matcher-> match ($ context-> getPathInfo ()); // Hoe een SEO URL te genereren $ generator = nieuwe UrlGenerator ($ routes, $ context); $ url = $ generator-> genereren ('foo_placeholder_route', array ('id' => 123,)); echo '
'; print_r ($ parameters); echo 'Gegenereerde URL:'. $ Url; Uitgang;  catch (ResourceNotFoundException $ e) echo $ e-> getMessage (); 

Het enige dat anders is in dit geval, is de manier waarop we routes initialiseren!

$ fileLocator = nieuwe FileLocator (array (__ DIR__)); $ loader = nieuwe YamlFileLoader ($ fileLocator); $ routes = $ loader-> load ('routes.yaml');

We hebben de YamlFileLoader loader om routes van de. te laden routes.yaml bestand in plaats van het rechtstreeks in de PHP zelf te initialiseren. Afgezien daarvan is alles hetzelfde en zou hetzelfde resultaat moeten opleveren als dat van de basic_routes.php het dossier.

De alles-in-één router

Ten slotte gaan we in dit gedeelte door de router klasse, waarmee u routering snel kunt instellen met minder regels code.

Ga je gang en maak de all_in_one_router.php bestand met de volgende inhoud.

fromRequest (Request :: createFromGlobals ()); $ router = nieuwe router (nieuwe YamlFileLoader ($ fileLocator), 'routes.yaml', array ('cache_dir' => __DIR __. '/ cache'), $ requestContext); // Zoek de huidige route $ parameters = $ router-> match ($ requestContext-> getPathInfo ()); // Hoe een SEO-URL te genereren $ routes = $ router-> getRouteCollection (); $ generator = nieuwe UrlGenerator ($ routes, $ requestContext); $ url = $ generator-> genereren ('foo_placeholder_route', array ('id' => 123,)); echo '
'; print_r ($ parameters); echo 'Gegenereerde URL:'. $ Url; Uitgang;  catch (ResourceNotFoundException $ e) echo $ e-> getMessage (); 

Alles is vrijwel hetzelfde, behalve dat we de. Hebben geïnstantieerd router object samen met de nodige afhankelijkheden.

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

Met dat op zijn plaats, kunt u meteen de wedstrijd methode van het routerobject voor routemapping.

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

U moet ook de. Gebruiken getRouteCollection methode van het object Router om routes op te halen.

$ routes = $ router-> getRouteCollection ();

Conclusie

Ga je gang en verken de andere beschikbare opties in het onderdeel Routing - ik zou graag je gedachten horen!

Vandaag hebben we de Symfony Routing-component verkend, wat de implementatie van routing in PHP-applicaties een fluitje van een cent maakt. Onderweg hebben we een handvol voorbeelden gemaakt om verschillende aspecten van de routingcomponent te demonstreren. 

Ik hoop dat je dit artikel leuk vond en aarzel niet om je mening te plaatsen via de onderstaande feed!