Vandaag gaan we door het Symfony Routing-onderdeel, waarmee u routering in uw PHP-applicaties kunt instellen.
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:
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.
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.
Route
object voor elk van uw toepassingsroutes.Route
objecten voor de RouteCollection
voorwerp.RequestContext
object dat de huidige contextinformatie van het verzoek bevat.UrlMatcher
object door de RouteCollection
object en de RequestContext
voorwerp.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.
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.
RequestContext
VoorwerpVervolgens 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 ());
UrlMatcher
VoorwerpTen 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.
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.
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.
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] +'
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!