Slim framework en routes

Architectuur
Maik Gruppen, 3 september 2013

Voor het admin panel van Savvii gebruiken we Slim (i.c.m. Twitter bootstrap). Slim is een php framework met goede route mogelijkheden. Ideaal voor ons want Slim heeft geen eigen database maar ‘praat’ slechts met onze interne API. Het gebruik van Slim Framework maakt het opzetten van gebruikersomgeving een stuk makkelijker, maar gaat niet zonder slag of stoot. Hieronder enkele tips voor het werken met routes in Slim.
slim1-150x150

Om iets te kunnen zeggen over routes moeten we eerst definiëren wat de bronnen zijn die we willen bekijken en/of bewerken. Deze bronnen zijn, voor dit voorbeeld, account en sites. Account is de plek waar persoonlijke gegevens opgeslagen zijn zoals naam, e-mailadres, etc. Sites is een iets complexer en samengestelde bron. In dit voorbeeld houden we het simpel en kijken we naar algemene gegevens en domeinen.

Als je bovenstaande bronnen vertaalt naar routes voor de website krijg je het volgende url-schema:

/account
/sites
/sites/1/overview
/sites/1/domains

Om het voorbeeld redelijk simpel te houden kijken we alleen naar het opvragen van informatie, we maken dan gebruik van GET aanvragen. Hierbij schrijven we /sites/1/… als /sites/:site/… waarbij :site de identificatie is voor de site die we opvragen.  De routes die we net vastgesteld hebben vertalen zich dan naar:

[php]$app-&gt;get(‘/account(/)’, function () …);<br />$app-&gt;get(‘/sites(/)’, function () …);<br />$app-&gt;get(‘/sites/:site/overview(/)’, function ($site) …);<br />$app-&gt;get(‘/sites/:site/domains(/)’, function($site) …);<br />[/php]

Gegroupeerde routes

Hierin zien we al snel dat aardig wat overlap in de routes zit. Daarnaast is het omzetten van een route erg veel werk. Stel dat we /sites/ om willen zetten naar /yoursites/, dan moeten we elke route aanpassen om het goede adres erin te zetten. Dit kan makkelijker door gebruik te maken van gegroepeerde routes. Als we de routes uit elkaar halen zien we de volgende patronen:

/account              1x
/sites                3x
/sites/:site          2x
/sites/:site/overview 1x
/sites/:site/domains  1x

Voor /account is $app->get(‘/account’, function () …); goed genoeg omdat deze maar een enkele keer vermeld staat. Voor /sites en /sites/:site is het een ander verhaal. Hier komen groups van Slim bij kijken. Met een group kun je een deel van de url delen met onderliggende functies. Zetten we alle losse route functies om naar gegroepeerde route functies dan ziet het er zo uit:

[php]// /account<br />$app-&gt;get(‘/account’, function () …);<br />// /sites(/…)<br />$app-&gt;group(‘/sites’, function () {<br /> // /sites(/)<br /> $app-&gt;get(‘/’, function () …);<br /> // /sites/:site(/…)<br /> $app-&gt;group(‘/:site’, function ($site) {<br /> // /sites/:site/overview<br /> $app-&gt;get(‘/overview’, function () use ($site) …);<br /> // /sites/:site/domains<br /> $app-&gt;get(‘/domains’, function () use ($site) …);<br /> });<br />});<br />[/php]

Hier introduceren we ook het eerste probleem waar je tegenaan kunt lopen. Zodra je deze gegroepeerde routes probeert uit te voeren op je webserver zul je een foutmelding krijgen. Voordat een aanvraag behandeld wordt loopt Slim door de routes heen om ze intern op te slaan. Dit doet Slim om de aanvraag te kunnen koppelen aan de juiste route. Echter, bij het doorlopen van de routes heeft Slim nog geen :site die de afhandelende functie wel verwacht. Dit kun je voorkomen door de functie als volgt te definiëren:

[php]$app-&gt;group(‘/:site’, function ($site=null) …);[/php]

Dit zorgt ervoor dat wanneer Slim de functie aanroept geen parameter meegegeven hoeft te worden en routes die in de groep gedefinieerd worden geregistreerd kunnen worden.

Het voordeel van deze gegroepeerde functies is dat het aanpassen van een route een stuk eenvoudiger geworden is. Als we nu /sites willen wijzigen naar /yoursites dan hoeven we dat nog maar op één plaats in de routes te doen. Maar als we de links gebruiken op pagina’s dan moeten we daar voor elk voorkomen van de url een wijziging doen. Ook dit kan makkelijker.

Benoemde routes

Om benoemde routes te gebruiken moeten we eerst de routes die we willen gebruiken een naam geven. De code die we aan het bestaande deel toevoegen is ->name(<naam>). Als we onze code uitbreiden krijgen we:

[php]$app-&gt;get(‘/account’, function () …)-&gt;name(‘account’);<br />// /sites(/…)<br />$app-&gt;group(‘/sites’, function () {<br /> // /sites(/)<br /> $app-&gt;get(‘/’, function () …)-&gt;name(‘sites’);<br /> // /sites/:site(/…)<br /> $app-&gt;group(‘/:site’, function ($site) {<br /> // /sites/:site/overview<br /> $app-&gt;get(‘/overview’, function () use ($site) {<br /> …<br /> })-&gt;name(‘overview’);<br /> // /sites/:site/domains<br /> $app-&gt;get(‘/domains’, function () use ($site) {<br /> …<br /> })-&gt;name(‘domains’);<br /> });<br />});[/php]

Door elke route een naam te geven kunnen we de route in een template aanroepen met SlimSlim::getInstance()->urlFor(<naam>, <parameters>);. Als voorbeeld de code voor een aanroep naar /account en naar /sites/:site/overview:

[php]SlimSlim::getInstance()-&gt;urlFor(‘account’);<br />SlimSlim::getInstance()-&gt;urlFor(‘overview’, array(‘site’=&gt;$site));[/php]

Merk op dat de variabele $site meegegeven wordt aan de tweede regel. Deze is nodig om :site in de route te vervangen met de waarde die het moet krijgen.

Als je nu in de code de route van /sites wijzigt naar /yoursites hoef je de verwijzingen op pagina’s op je site zelf niet meer te wijzigen, deze worden gegenereerd door urlFor.

Om je site makkelijker te kunnen onderhouden is het gebruik van gegroepeerde en benoemde routes aangeraden. Je code blijft een stuk overzichtelijker en je maakt minder snel fouten.

Maik Gruppen - Maik is super gepassioneerd over WordPress, development en ondernemen. Wat hij leert deelt hij graag met de community.

Reactie achterlaten

Leer ons beter kennen!