Alternatief voor ?id=1 in je URL - RESTful en slug routing in PHP – tutorial

Gepubliceerd: 22.07.2025

Zoek je een SEO-vriendelijk alternatief voor oude URL’s zoals pagina.php?id=1? Leer in deze tutorial hoe je in PHP en Symfony overstapt naar RESTful en slug-gebaseerde URL’s.

Samenvatting

RESTful URL’s met slugs zijn leesbaar, vindbaar en schaalbaar. In deze tutorial leer je met voorbeelden hoe je dit toepast in PHP én Symfony met Sluggable-extensie.

Wat is een ID?

Een ID is een uniek getal in een database, bijvoorbeeld id=1. Hiermee roep je een specifiek item op. Functioneel, maar niet gebruiksvriendelijk of goed voor SEO.

Wat betekent RESTful?

REST staat voor Representational State Transfer. Het is een architectuurstijl waarbij URL’s betekenisvol zijn:

  • /posts – alle blogposts
  • /posts/42 – post met ID 42
  • /posts/42/vegan-pasta – post met slug

RESTful betekent dus: duidelijke, voorspelbare en goed gestructureerde URLs.

Waarom zijn slugs beter dan ID’s?

  • Leesbaarheid: Mensen begrijpen meteen waar de pagina over gaat.
  • SEO: Zoekmachines herkennen keywords in je URL.
  • Redirects: Verkeerde slug? Gebruik een 301-redirect.

Oude aanpak (met id)

<?php
$id = $_GET['id'];
$post = findPostById($id);
echo $post['title'];
?>

Nieuwe aanpak (RESTful + slug)

<?php
$request = $_SERVER['REQUEST_URI'];
$parts = explode('/', trim($request, '/'));
$id = (int) $parts[1];
$slug = $parts[2] ?? '';
$post = getPostById($id);
if ($slug !== $post['slug']) {
  header("Location: /posts/{$id}/{$post['slug']}", true, 301);
  exit;
}
echo $post['title'];
?>

Slug genereren in PHP

function makeSlug($string) {
  $slug = strtolower(trim($string));
  $slug = preg_replace('/[^a-z0-9]+/', '-', $slug);
  return trim($slug, '-');
}
echo makeSlug("Vegan Pasta Recept"); // vegan-pasta-recept
Slug automatisch in Symfony met Sluggable

Gebruik je Symfony + Doctrine? Dan kun je met Gedmo Sluggable automatisch slugs genereren uit titels.

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Post {
  /** @ORM\Column(type="string") */
  private $title;

  /**
   * @Gedmo\Slug(fields={"title"})
   * @ORM\Column(length=128, unique=true)
   */
  private $slug;
}

Symfony genereert automatisch de slug en vult het veld bij het opslaan van de entity.

Voordelen op een rij

  • ✅ SEO-vriendelijk
  • ✅ Duidelijke en nette URL-structuur
  • ✅ Ondersteund door frameworks zoals Symfony en Laravel
  • ✅ Gemakkelijk te redirecten bij slug-updates

Meer leren?