Как создать функцию маршрутизации по URL?

199
12 марта 2018, 00:11

Всегда делал так в index.php

<?php
  // Если главная страница
  if ($url == '/') {
     require('templates/pageMain.php');
  }
  // Если страница категории
  elseif (preg_match ('|^/category/([0-9]+)$|', $url, $var)) {
     require('templates/pageCategory.php');
  }
  // Если страница статьи
  elseif (preg_match ('|^/article/([0-9]+)/([0-9]+)$|', $url, $var)) {
     require('templates/pageArticle.php');
  }
  // Если страницы не существует
  else {
     require('templates/404.php');
  }
?>

Кто может показать решение проще и изящнее? А то когда 200 шаблонов страниц, получается слишком большая обойма регулярок.

Answer 1
<?php
$routes = array (
    '|^/$|' => 'templates/pageMain.php',
    '|^/category/([0-9]+)$|' => 'templates/pageCategory.php',
    '|^/article/([0-9]+)/([0-9]+)$|' => 'templates/pageArticle.php',
    '|^.|' => 'templates/404.php'
);
foreach ($routes as $regexp => $route)
{
    if (preg_match ($regexp, $url, $var))
    {
        require ($route);
        exit;
    }
}

?>

Писал на коленке, на работоспособность не проверял. Думаю суть тут ясна ;) 404 страница должна быть последней в массиве она срабатывает вконце, когда другие условия не сработали. Както так ...

Answer 2

Почему бы просто не выкусывать первую часть пути и по этой части подгружать соответствующий шаблон?

// Если главная страница
if ($url == '/') {
  $file = 'templates/pageMain.php';
} elseif (preg_match ('|^/(\w+)/|', $url, $var)) {
  $file = 'templates/page' . ucfirst($var[1][0] . '.php');
} else
  $file = '';
if (file_exists($file))
  require($file);
else {
  require('templates/404.php');
}
READ ALSO
Переход на другую страницу в yii

Переход на другую страницу в yii

Есть главная страница, которая рендерится в контроллере myПри переходе на другие страницы всё нормально

179
как проверить функцию на return без ее вызова. PHP

как проверить функцию на return без ее вызова. PHP

Есть функции в которых содежится оператор echoИ есть функции с echo и return

167