Voordat we verder kunnen met een zinvolle beschrijving van het zend framework, moeten we misschien eerst (uitgebreider) bekijken hoe het framework Urls eigenlijk behandelt. Daarom gaan we daar nu op in. Het is leuk om natuurlijk al iets te hebben draaien, maar dit is een basisprincipe dat ik toch even tussendoor wil doen, omdat het essentieel is voor het begrip van het Zend Framework. Het is tussen neus en lippen misschien al een keer genoemd, maar er is natuurlijk nog veel meer over te vertellen.
In de meeste tutorials zul je al eerder wat vinden over het routen van requests, en daarom verwacht ik eigenlijk dat de meeste hier ook al een en ander van weten. Ik heb daarom besloten om meteen maar wat dieper op de materie in te gaan, opdat je dit kunt overslaan als je het al weet, maar als je wilt je toch nog nuttige informatie uit deze ‘tutorial’ kan halen.
Basis Routing
Wat is routing? Routing is het nemen van het eind van de url, dat wil zeggen, alles wat na je basis url komt (zoals bram.jeropocs.com), en dat vervolgens omzetten in parameters om zo te kijken wat er eigenlijk uitgevoerd moet worden. Om dit op een mooie wijze (met ‘vriendelijke’ urls) te laten verlopen, hebben we al onze .htaccess file gebruikt. Via de index.php file, en vervolgens de bootstrap handelt het zf vervolgens alles netjes af.
Standaard werkt de router als volgt. Het eerste deel van de url wijst naar je controller, het tweede deel naar de action. Default bij beide is (logischerwijs) index. Dat wil zeggen dat http://localhost/index/index gelijk is aan http://localhost/. http://localhost/user/login verwijst dus naar de userController.php en daarin de loginAction(). Het bijbehorende view script file is dus views/scripts/user/login.phtml.
Wanneer je nu denkt: Controller ?, Action?, hoe wat, raad ik je aan om even terug te gaan naar artikel 2. Misschien dat ik hier in de toekomst nog een duidelijk artikel aan probeer te besteden.
Update: Wat ik inmiddels door artikel 0.b, over het mvc heb gedaan.
Voor ons is het ook nog handig om het volgende te weten. Wanneer we nu een andere module willen toevoegen, zoals een blog, kunnen we de url opbouwen als http://baseurl/module/controller/action. Wanneer je achter deze (of de originele zonder module) nog iets toe wilt voegen, zoals parameters, gebeurt dit in key-value pairs. oftewel de naam + waarde zoals http://baseurl/module/controller/action/naam1/waarde1/naam2/waarde2 etc.
Om een module (bijvoorbeeld een blog module) te laten werken, moeten we wel onze bootstrapfile aanpassen. Dit kan door de volgende regel:
1: /* zorgen dat ZF weet waar de controllers zijn */
2: $frontController->setControllerDirectory(‘../application/default/controllers’, ‘default’);
te vervangen door
1: /* zorgen dat ZF weet waar de controllers zijn */
2: $frontController->setControllerDirectory(array(
3: ‘default’ => ‘../application/default/controllers’,
4: ‘blog’ => ‘../application/blog/controllers’)
5: );
Een Voorbeeld van Routing, Controllers En Views in het Zend Framework
Nu heb je de basis om bestanden te maken, en te gebruiken. Ik zal nu eerst een voorbeeldje gaan behandelen voordat we geavanceerderdere routing gaan beschrijven.
Wat is er leuker dan mensen persoonlijk te begroeten? We gaan daarom in de default module een controller maken om mensen te groeten. Door http://localhost/user/groet/naam/bram/ straks in te tikken, kun je jezelf groeten.
Als je goed hebt opgelet, weet je nu dat je in de default/controllers map de file userController.php moet aanmaken. En je weet dat deze een groetAction bevat. De initiële opzet wordt dus:
1: <?php
2: class UserController extends Zend_Controller_Action
3: {
4: public function groetAction(){
5: $this->view->title =‘Groet jezelf’;
6: }
7: }
De titel moeten we wel meegeven, want die laden we dynamisch. Ook maken we het (nu nog lege) viewscript default/views/scripts/user/groet.phtml aan. Nu kunnen we naar http://localhost/user/groet/. We zien nu een lege pagina, maar de titel doet het al.
Als we er nu /naam/bram achter tikken, gebeurt er weinig. We gaan het als volgt aanpakken. Eerst kijken we of er een naam is, anders geven we een default waarde, en dan sturen we het bericht. Daarom zetten we eerst even de regel
<?php echo $this->message; ?>
in het view script.
De lange manier om in de controller de variabele te bekijken, maar die voor andere doeleinde (zoals redirects) wel handig is, is als volgt:
1: if ($this->_hasParam(‘naam’) {
2: $naam = $this->_getParam(‘naam’);
3: } else {
4: $naam = ‘vreemdeling’;
5: }
De verkorte notatie gaan we nu gebruiken, en de groetAction wordt dan als volgt:
1: public function groetAction(){
2: $this->view->title =‘Groet jezelf’;
3: $naam = $this->_getParam(‘naam’, ‘vreemdeling’);
4: $this->view->message = ‘Welkom ‘ . $naam;
5: }
wanneer we nu naar http://localhost/user/groet gaan, zien we "Welkom vreemdeling" (soms moet je hiervoor hard refreshen, Ctrl + F5). Als we gaan naar http://localhost/user/groet/naam/Bram zien we "Welkom Bram" als het goed is.
Nu kan ik me voorstellen dat je dit standaard wilt doen, en je dan de groet en naam een beetje overbodig vind, en dus liever mij groet via http://localhost/user/Bram/. Ik zelf vind dat ook een goed idee. Hiervoor hebben we iets geadvanceerdere routing nodig.
Een uitbreiding op de routing
Om de routing te versimpelen moeten we de bootstrap aanpassen. Het zal dus niet iets zijn wat we regelmatig doen. Om dit te doen voegen we achter de setControllerDirectory (regel 20 van de bootstrap.php) het volgende:
1: /* Zet een standaard routing om gebruikers te groeten */
2: $router = $frontController->getRouter();
3: $router->addRoute(
4: ‘user’,
5: new Zend_Controller_Router_Route(‘user/:naam’, array(‘controller’ => ‘user’, ‘action’ => ‘groet’))
6: );
Eerst halen we de instance van de router op, en vervolgens voegen we onze speciale groet routine hieraan toe. En zowaar: door naar http://localhost/user/Bram te gaan, zien we hetzelfde als voorheen. Nu eerst maar eens een beetje uitleg.
De eerste parameter die we toevoegen is de naam van de route. Dit heeft geen effect op de werking. De volgende parameter (de instance van de Zend_Controller_Router_Route class) wel. De eerste parameter geeft aan welke delen hij moet matchen, de route definitie. De user is een statisch deel, de :naam is een variabel deel en wordt aangegeven door middel van de dubbele punt (:). Vervolgens geven we aan naar welke controller en action dit moet worden gestuurd. Eventueel kun je nog meer parameters mee sturen, die ook met _getParam kunnen worden opgehaald. Eventueel kun je ook de wildcard ‘*’ gebruiken om op oorspronkelijk wijze, als oorspronkelijk door middel van key-value pairs, variabele door te spelen. Als we nu naar http://localhost/user/Bram/is/leuk/ zouden gaan, gaat hij opzoek naar de bramAction, die natuurlijk niet bestaat. Dit komt doordat deze regel niet match aan degene die door ons is ingesteld, en dus de oorspronkelijke routing volgt. Door nu van de route defintie ( user/:naam ) het volgende te maken, werkt het wel:
1: $router->addRoute(
2: ‘user’,
3: new Zend_Controller_Router_Route(‘user/:naam/*’, array(‘controller’ => ‘user’, ‘action’ => ‘groet’))
4: );
Nu wordt ‘leuk’ doorgegeven in de variabele ‘is’.
We kunnen via onze routing zelfs al een default variable meegeven. Door bij de array met de controller bijvoorbeeld ‘naam => stranger’ in te vullen, zal de check nutteloos worden in de controller omdat hij daar al eventueel een default naam heef. Wanneer je geen naam mee geeft zie je ‘Welkom Stranger’, in plaats van ‘Welkom Vreemdeling’ (http://localhost/user/ is nu de url waar je dat kan zien). Soms is dat handig, hier niet echt denk ik.
Met het creëren van de nieuwe route kunnen we ook de variabele aan een bepaalde voorwaarde laten voldoen door middel van regular expressions. Met de volgende route geef ik een voorbeeld van het meegeven van de standaard naam, en moet een naam uit kleine letters bestaan door de regular expression te gebruiken.
1: $router->addRoute(
2: ‘user’,
3: new Zend_Controller_Router_Route(
4: ‘user/:naam/*’,
5: array(‘controller’ => ‘user’, ‘action’ => ‘groet’, ‘naam’ => ’stranger’),
6: array(‘naam’ => ‘[[a-z]+]’)
7: )
8: );
Wanneer je ingevoerde url niet voldoet, wordt de request behandeld met de volgende route. In ons geval, wanneer je dus iets anders dan alleen maar kleine letters gebruikt, wordt je doorgestuurd naar de default route, en gaat de route dus opzoek naar de action met de naam erin, en krijg je dus een foutmelding, omdat deze niet bestaat. Je krijgt dan dus niet(!) de default waarde. Dit is dus niet echt een nuttige route, maar toch leuk om dit aan je arsenaal toe te kunnen voegen.
Later wanneer we de Zend_Config class hebben besproken, zal ik nog laten zien hoe je ini files kunt gebruiken om routes toe te voegen. Mocht je daar niet op kunnen wachten, kun je ook hier kijken:
http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.add-config
Op dezelfde pagina kun je ook nog iets vinden over het direct in je route definitie opnemen van regex. Maar daar ga ik niet op in. Misschien later als we het nodig hebben. Volgende keer gaan we dan toch echt naar de error handling, zoals al eerder beloofd. Dit is niet zo een groot onderwerp en zullen we dus wel snel hebben behandeld.

0 responses so far ↓
There are no comments yet...Kick things off by filling out the form below.
Leave a Comment