PHP 엔진에서 간단한 라우팅

이전 강의에서는 우리 사이트에 오직 한 가지 유형의 URL만 있었습니다. 물론 일반적으로 웹사이트에는 여러 가지 유형의 주소가 있습니다.

각 주소 유형은 자체 정규 표현식으로 처리될 것이며, 이를 라우트(route)라고 합니다. 따라서 라우트와 이를 처리하는 코드를 매칭하는 과정을 라우팅(routing)이라고 합니다.

예를 들어, 우리에게 두 가지 유형의 주소가 있다고 가정해 봅시다. 각 그룹에 대해 자체 라우트를 작성해 보겠습니다:

index.php<?php
  if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
    // 슬러그별 단일 페이지
  }
  
  if (preg_match('#^/page/all$#', $url, $params)) {
    // 모든 페이지 목록
  }
?>

편의를 위해 각 라우트의 처리 코드를 별도의 파일로 분리해 보겠습니다:

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';
  }
?>

연결되는 파일들은 결과로 페이지의 타이틀과 콘텐츠가 담긴 배열을 반환해야 합니다.

슬러그별 단일 페이지를 출력하는 첫 번째 파일의 코드를 작성해 봅시다:

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;
?>

이제 모든 페이지의 링크 목록을 출력하는 두 번째 파일의 코드를 작성해 봅시다:

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' => 'all pages',
    'content' => $content
  ];
  
  return $page;
?>

조건 중 하나가 실행된 후, 변수 $page에는 항상 하나의 구조에서 온 배열이 담겨 있을 것입니다. 이 배열을 사용하여 사이트 템플릿에 타이틀과 콘텐츠를 넣어 보겠습니다:

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;
?>

모든 것을 합쳐서 다음 코드를 얻습니다:

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

사용자가 있는 웹사이트가 있다고 가정해 봅시다. 단일 사용자 표시 페이지, 모든 사용자 출력 페이지, 그리고 새로운 사용자 추가를 위한 폼 페이지를 만들어 보세요.