Programmeren met Yii2 routering en URL-creatie

Als je vraagt: "Wat is Yii?" uitchecken Introductie tot het Yii Framework, die de voordelen van Yii beoordeelt en een overzicht van Yii 2.0 bevat.

Introductie tot Routing

In deze serie Programming With Yii2 begeleid ik lezers in gebruik van het Yii2 Framework voor PHP. 

In de tutorial van vandaag zal ik routering en URL-creatie in Yii bespreken. Wanneer een browserverzoek aankomt in het index.php-bestand van uw Yii-toepassing, moet het worden geparseerd om te bepalen welke controller en methode u wilt gebruiken. Dat is routing. Het omgekeerde proces om naar delen van uw applicatie te linken is URL-creatie, wat het best op programmatische wijze gebeurt.

Yii biedt veel flexibiliteit bij het beheer van routing en het genereren van koppelingen. Volg mij terwijl ik de basisbeginselen doorneem.

Voordat we van start gaan, onthoud alsjeblieft dat ik probeer deel te nemen aan de onderstaande discussies. Als je een vraag of een suggestie voor een onderwerp hebt, plaats dan een reactie hieronder of neem contact met mij op via Twitter @reifman. 

Opmerking: als je de kloof tussen de programmeerperiodes van de Yii-serie hebt opgemerkt, is dat omdat ik het moest hebben hersenoperatie vorig jaar. Bedankt voor uw geduld en ondersteuning - het is goed om regelmatig opnieuw te schrijven en ik kijk uit naar de voortzetting van de dekking van Yii2.

Achtergrond

De URL-manager van Yii is de toepassingscomponent die wordt gebruikt voor het parseren van inkomende aanvragen, parseRequest () en voor het genereren van nieuwe URL's op programmatische wijze, createUrl ().

Verzoeken worden geparseerd in routes, die deze vorm aannemen:

ControllerID / ActionID

In wezen geeft URL Manager Yii de opdracht om de controller en actiemethode te maken en aan te roepen.

In uw toepassing moet u URL's genereren die op de juiste manier kunnen worden geparseerd op verzoek van gebruikers. Gebruik makend van createUrl () hiervoor zorgt ervoor dat inkomende aanvragen met succes kunnen worden toegewezen.

Hier is een voorbeeld:

gebruik yii \ helpers \ Url; // Url :: to () roept UrlManager :: createUrl () aan om een ​​URL te maken $ url = Url :: to (['message / view', 'id' => 100]);

Zonder een MVC-raamwerk kan elk PHP-bestand in uw toepassing direct reageren op verzoeken, wat betekent dat u de beveiliging van elk bestand moet beheren. Met MVC en URL-manager wordt basisbeveiliging op centraal niveau geboden en wordt de toegang tot uw applicatie redelijk gecontroleerd. Dit is een van de belangrijkste redenen om niet te storen in vanilla PHP-frameworks rock!

Laten we een paar details over het onderwerp van vandaag bekijken.

routing

Verzoeken van gebruikers komen via de browser via internet naar uw server in de vorm van URL's. Laten we er een bekijken van een gebruiker die een inlogpagina aanvraagt ​​in mijn opstartreeksapplicatie, Meeting Planner:

https://meetingplanner.io/index.php/site/login

Mijn applicatie gebruikt mooie URL's in Yii (hieronder beschreven); merk minder queryvariabelen op. Zonder dat ziet de URL er als volgt uit:

https://meetingplanner.io/index.php?r=site/login

In elk geval, parseRequest verwerkt de URL en maakt en roept SiteController.php op met actionLogin ().

Met mooie URL's controleert de URL-manager geregistreerde regels. In Meeting Planner bevinden ze zich in het algemene configuratiebestand:

'componenten' => ['urlManager' => ['class' => 'yii \ web \ UrlManager', ... 'rules' => ['/'=>'/ bekijken ','//'=>'/','/'=>'/',' defaultRoute '=>' / site / index ',],],

Als er geen regel overeenkomt of als er een fout is bij het bereiken van een controller en actie, wordt een 404-fout, yii \ web \ NotFoundHttpException-uitzondering gegenereerd.

Maar hierboven is er een standaard route ingesteld om naar de startpagina te gaan op SiteController actionIndex, die ongeëvenaarde URL-verzoeken zal behandelen.

Laten we eens naar een van de bovenstaande regels kijken:

'/'=>'/uitzicht',

Er staat dat als u een verzoek ontvangt voor een controller gevolgd door een woord (\ w+) gevolgd door een schuine streep en een cijfer (\ d+), verzendt die aanvraag naar het controllerbestand met dezelfde naam en roept u aan actionView ($ id) met het nummer, d.w.z.. vergadering / view / 130 calls MeetingController.php actionView (130).

Het definiëren van uw regels is belangrijk en kan de algehele prestaties of responstijd van uw site verhogen of verminderen. Misschien wilt u meer weten over Yii's geavanceerde parametrering van routes om de prestaties te optimaliseren. Schrijfregels kunnen gedetailleerder worden, waar ik vandaag niet op inga.

Mooie URL's

Zoals ik hierboven al noemde, schakelen Pretty URL's van Yii's op parameters gebaseerde routering naar een padgebaseerde routering. Deze URL vraagt ​​bijvoorbeeld om een ​​vergadering met ID 130 te bekijken.

https://meetingplanner.io/meeting/130

Of deze URL vraagt ​​om het bekijken van een plaats genaamd El Diablo Coffee:

https://meetingplanner.io/place/el-diablo-coffee-co

Misschien wil je lezen Hoe programmeer je met Yii2: Sluggable Behavior (Envato Tuts +) voor meer informatie over het implementeren van slugs om dit soort benoemde URL's te beheren.

Om Pretty URL's in te schakelen, moet je activeren enablePrettyUrl in urlManager:

'urlManager' => ['class' => 'yii \ web \ UrlManager', // Index.php uitschakelen 'showScriptName' => false, // Uitschakelen r = routes 'enablePrettyUrl' => true, 'rules' => array ('/'=>'/ bekijken ','//'=>'/','/'=>'/',),],

Notitie: Op dit moment kunt u index.php ook uitschakelen in de URL met showScriptName; Ik heb echter nog steeds problemen met het maken van URL's zonder index.php in mijn huidige toepassingsproject. Dit opzoeken staat op mijn takenlijst.

U moet ook een .htaccess-bestand maken en inschakelen mod_rewrite voor Apache:

RewriteEngine op # Als er een directory of een bestand bestaat, gebruik het dan direct RewriteCond% REQUEST_FILENAME! -F RewriteCond% REQUEST_FILENAME! -D # Stuur het anders door naar index.php RewriteRule. index.php

CatchAll-modus

Een andere leuke functie van Yii-routering is de mogelijkheid om uw toepassing eenvoudig in de onderhoudsmodus te plaatsen. Definieer gewoon een catchAll instelling in de applicatieconfiguratie, actie en weergave:

 dirname (dirname (__ DIR__)). '/ vendor', 'language' => 'en', // english 'catchAll' => ['site / offline'], 'components' => ['urlManager' => [ 

Ik heb ook een toegevoegd actionOffline in SiteController.php en een offline.php-weergave.

URL's maken

Yii biedt een hulpmethode yii \ helpers \ Url :: to () om koppelingen in uw toepassing te maken die correct overeenkomen met de parseerregels. Het programmatisch genereren van koppelingen met de infrastructuur van Yii draagt ​​bij aan het behoud van de beheersbaarheid en overdraagbaarheid van uw toepassingscode.

Hier zijn enkele voorbeelden van het maken van URL's uit de documentatie van Yii:

gebruik yii \ helpers \ Url; // maakt een URL naar een route: /index.php?r=post%2Findex echo Url :: to (['post / index']); // maakt een URL naar een route met parameters: /index.php?r=post%2Fview&id=100 echo Url :: to (['post / view', 'id' => 100]); // maakt een verankerde URL: /index.php?r=post%2Fview&id=100#content echo Url :: to (['post / view', 'id' => 100, '#' => 'content'] ); // maakt een absolute URL: http://www.example.com/index.php?r=post%2Findex echo Url :: to (['post / index'], true); // maakt een absolute URL met behulp van het https-schema: https://www.example.com/index.php?r=post%2Findex echo Url :: to (['post / index'], 'https');

Als de mooie URL-indeling is ingeschakeld, zijn de gemaakte URL's natuurlijk anders.

Hier is een voorbeeld van het genereren van een link in het rasterbeheer Vergaderingslijst voor Meeting Planner:

terug '
$ Model-> id]). ''>'. $ Model-> onderwerp.'
'$ Model-> getMeetingParticipants ($ model-> id).'
';

Ik neem ook veel links op in uitgaande e-mails voor Meeting Planner, waarvoor een aantal identieke argumenten vereist zijn voor het valideren van gebruikerstoegang. Ik heb een helper gemaakt voor het bouwen van deze commando's die gebruikt worden Url: naar ():

class MiscHelpers public static function buildCommand ($ meeting_id, $ cmd = 0, $ obj_id = 0, $ actor_id = 0, $ auth_key = ") return Url :: to (['meeting / command', 'id' => $ meeting_id, 'cmd' => $ cmd, 'actor_id' => $ actor_id, 'k' => $ auth_key, 'obj_id' => $ obj_id], true);

Het schrijven van ruwe PHP-code om handmatig links te maken zoals deze zou tijdrovend, foutgevoelig en minder draagbaar zijn. Url :: naar () bespaart veel tijd zowel bij het coderen als bij het oplossen van problemen.

Notitie: Ik zal over schrijven Yii Helpers in een aankomende aflevering. Het gebruik van een algemeen toegankelijke functie binnen mijn helper bespaart me veel moeite en verlaagt de algehele codering.

In Closing

Aan de slag met een MVC kan verwarrend zijn en routes en URL's kunnen hierin een rol spelen. Misschien had ik eerder over routes in de serie moeten schrijven. Ik hoop in ieder geval dat je nieuwe dingen over Yii en het flexibele ontwerp van de toepassing ervan met routes en URL's hebt geleerd.

Bekijk de komende tutorials in onze Programming With Yii2-serie terwijl we doorgaan met duiken in verschillende aspecten van het framework. Laat me bijvoorbeeld weten of u meer wilt zien over geavanceerde routing. Ik verwelkom aanvragen voor functies en onderwerpen. Je kunt ze plaatsen in de reacties hieronder of e-mail me op mijn Lookahead Consulting-website.

Als je nu een meer geavanceerde Yii2-applicatie wilt verkennen, bekijk dan onze opstartserie en vergaderingplanner. De applicatie is nu in de alpha-release en je kunt deze gebruiken om vergaderingen met vrienden te plannen. Je kunt de code ook downloaden; het is open source.

Als je wilt weten wanneer de volgende Yii2-handleiding aankomt, volg me dan @reifman op Twitter of bekijk mijn instructeurspagina. Op mijn instructeurspagina staan ​​alle artikelen uit deze serie zodra ze zijn gepubliceerd. 

Gerelateerde Links

  • Routing en URL-creatie - Yii 2.0-documentatie
  • Hoe te programmeren met Yii2: slap gedrag (Envato Tuts +)
  • Yii2 Developer Exchange