PHP Motorunda Basit Yönlendirme

Önceki derste sitemizde sadece bir URL grubu vardı. Tabii ki, genellikle bir sitede birkaç farklı adres türü bulunur.

Her adres grubu, kendi düzenli ifadeleriyle işlenecek, bunlara rotalar denir. Buna bağlı olarak rotaları ve onları işlemek için gereken kodu eşleştirme sürecine yönlendirme denir.

Örneğin, iki tür adresimiz olduğunu varsayalım. Her grup için kendi rotamızı yazalım:

index.php<?php
  if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
    // slug'a göre tek bir sayfa
  }
  
  if (preg_match('#^/page/all$#', $url, $params)) {
    // tüm sayfaların listesi
  }
?>

Kolaylık olması için her rotanın işlem kodunu ayrı bir dosyaya alalım:

index.php<?php
  if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
    $page = include 'view/page/show.php';
  }
  
  if (preg_match('#^/page/all$#', $url, $params)) {
    $page = include 'view/page/all.php';
  }
?>

Bağlanan dosyalar, sonuç olarak sayfanın başlığını ve içeriğini içeren bir dizi döndürmelidir.

Slug'ına göre tek bir sayfa gösteren ilk dosyanın kodunu yazalım:

view/page/show.php<?php
  $slug   = $params[1];
  $query  = "SELECT * FROM pages WHERE slug='$slug'";
  
  $res = mysqli_query($link, $query) or die(mysqli_error($link));
  $page   = mysqli_fetch_assoc($res);
  
  return $page;
?>

Şimdi de tüm sayfalara bağlantı listesi gösteren ikinci dosyanın kodunu yazalım:

view/page/all.php<?php
  $query = "SELECT slug, title FROM pages";
  $res = mysqli_query($link, $query) or die(mysqli_error($link));
  
  for ($data = []; $row = mysqli_fetch_assoc($res); $data[] = $row);
  
  $content = '';
  foreach ($data as $page) {
    $content .= '
      <div>
        <a href="/page/'  . $page['slug'] . '">' . $page['title'] . '</a>
      </div>
    ';
  }
  
  $page = [
    'title' => 'tüm sayfalar',
    'content' => $content
  ];
  
  return $page;
?>

Koşullardan birinin çalışmasından sonra $page değişkeninde her zaman aynı yapıda bir dizi olacaktır. Bu diziyi kullanarak site şablonuna başlık ve içerik ekleyelim:

index.php<?php
  $layout = file_get_contents('layout.php');
  $layout = str_replace('{{ title }}', $page['title'], $layout);
  $layout = str_replace('{{ content }}', $page['content'], $layout);
  
  echo $layout;
?>

Hepsini bir araya getirip aşağıdaki kodu elde edelim:

index.php<?php
  $url = $_SERVER['REQUEST_URI'];
  
  if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
    $page = include 'view/page/show.php';
  }
  
  if (preg_match('#^/page/all$#', $url, $params)) {
    $page = include 'view/page/all.php';
  }
  
  $layout = file_get_contents('layout.php');
  $layout = str_replace('{{ title }}', $page['title'], $layout);
  $layout = str_replace('{{ content }}', $page['content'], $layout);
  
  echo $layout;
?>
Задание 1

Kullanıcıların olduğu bir siteniz olduğunu varsayalım. Bir kullanıcıyı göstermek için bir sayfa, tüm kullanıcıları listelemek için bir sayfa ve yeni kullanıcı eklemek için form içeren bir sayfa yapın.