Vriendelijke URL's met CakePHP 1.3

Inleiding tot vriendelijke url's

In deze serie artikelen over CakePHP 1.3 (met grotendeels dezelfde toepasbaarheid in 1.2) duiken we in het concept van vriendelijke URL's, ook wel bekend als Search Engine Friendly URLs. Deze URL's verbeteren de indexatie van je website door zoekmachines zoals Google. Een bijkomend voordeel is dat de URL's zelf duidelijker de inhoud weergeven. We zullen dit illustreren met een voorbeeld, uitgaande van basiskennis van CakePHP (zie de CakePHP Cookbook).

Het basis voorbeeld: posts controller en model

Stel je voor dat we een Posts controller en een Post model hebben (in mijn geval artikelen). We willen een link creëren naar een specifiek artikel. In de controller maken we een view methode. De code vult de gegevens op: $this->Post->id = $id; $post = $this->Post->find('first'); $this->set('post', $post);. We gebruiken find in plaats van read omdat we de controller niet onnodig met data willen overbelasten.

De standaard url: niet ideaal

Met de standaardinstellingen kunnen we een artikel benaderen via een link als http://localhost/posts/view/1. Deze link is echter niet informatief voor de gebruiker en is niet optimaal voor zoekmachines. Ons doel is een URL in de vorm van http://localhost/articulen/id_articulen-titel_articulen te bereiken. Dit vereist het gebruik van de CakePHP router.

Configureren van de router in routes.php

We openen het bestand /app/config/routes.php, de plek waar de router geconfigureerd wordt. Eerst proberen we http://localhost/articulen/id te bereiken. Dit voegen we toe: Router::connect('/articulen/:id', array('controller' => 'posts', 'action' => 'view'), array('pass' => array('id'), 'id' => '[0-9]+'));. We gaan ervan uit dat het id veld numerieke waarden bevat. Vervolgens passen we dit aan voor de definitieve vorm.

De verbeterde router configuratie

Voor de uiteindelijke URL-structuur gebruiken we: Router::connect('/articulen/:id-:slug', array('controller' => 'posts', 'action' => 'view'), array('pass' => array('id', 'slug'), 'id' => '[0-9]+', 'slug' => '.+'));. Dit creëert een route met een ID en een slug. In de view genereren we de link met $html->link('Link', array('controller' => 'posts', 'action' => 'view', 'id' => $id, 'slug' => $slug)). De slug is een korte reeks tekens die de inhoud van de link weergeeft, zonder spaties of speciale tekens.

De rol van de slug en inflector::slug

De slug is geoptimaliseerd voor SEO en is vaak gebaseerd op de titel van het artikel. We gebruiken de Inflector::slug('titel eerste artikel', '-') methode om de titel om te zetten in een slug. De eerste parameter is de string om te 'opschonen', de tweede is het teken om speciale karakters mee te vervangen. Het resultaat is bijvoorbeeld titel-eerste-artikel. Helaas behandelt CakePHP 1.3 diakritische tekens (zoals é, à, etc.) niet correct.

Omgaan met diakritische tekens in slugs

Om dit op te lossen, kunnen we een eigen functie maken of de inflector.php file aanpassen. We wijzigen de $default array in de slug methode. Dit is een complex patroon om alle diakritische tekens te behandelen. Let op: deze aanpassing moet bij elke CakePHP update opnieuw worden gedaan. Een ticket is ingediend om deze functionaliteit in toekomstige versies op te nemen.

Conclusie

Met deze stappen kun je vriendelijke URL's implementeren in je CakePHP 1.3 applicatie. Dit verbetert zowel de gebruikerservaring als de vindbaarheid door zoekmachines. We hopen dat deze uitleg nuttig is!