티스토리 뷰

개요

만약 나보고 PHP 기반의 REST API를 구축하라고 한다면 가장 먼저 선택할 프레임워크는 가장 성능이 좋은 Phalcon이다. 지난 글에서도 많이 다룬 적이 있다. 2순위로는 가장 대중적인 Laravel 기반의 Lumen을 선택할 것이다. 만약 PHP 5.3.2라는 제약사항이 있다면? 앞서 언급한 마이크로 프레임워크들은 구닥다리가 되버린 PHP 5.3.2 버전을 지원하지 않는다. 이 경우 선택지는 Flight이다. PHP 5.3.0 이상이면 어디서나 작동하는 가볍고 직관적인 마이크로 프레임워크이다. 본 글에서는 간단힌 Flight 기반의 REST API 작성법을 소개하겠다.

사전지식

Composer 설정

Composer 없는 세상은 상상만 해도 끔찍하다. 다행히도 ComposerPHP 5.3.2부터 지원한다. 주의할 점은 Composer 1.0.3을 설치해야 한다. 이후 버전은 PHP 5.6 이상 만을 지원한다.


  • 프로젝트 루트 디렉토리에 composer.json 파일을 아래와 같이 작성한다.
{
  "require": {
    "mikecao/flight": "^1.3"
  },
  "autoload": {
    "psr-4": {
      "HelloFlight\\": "src/HelloFlight/"
    }
  }
}
  • 프로젝트 루트 디렉토리에서 아래와 같이 실행한다.
$ composer install
$ composer dump-autoload --optimize
  • composer install 명령을 실행하면 써드파티 라이브러리를 프로젝트에 설치해준다. (본 예제에서는 Flight 마이크로 프레임워크를 설치한다.)

  • composer dump-autoload --optimize 명령은 프로젝트 내부 클래스에 대한 최적화된 오토로더를 생성해준다. 프로젝트 배포 전 매번 수작업으로 실행해 주어야 한다.

프로젝트 구조

작성될 프로젝트 구조는 아래와 같다.

/src
/HelloFlight
  /Controllers
    HelloController.php
/vendor
  /composer
  /mikecao
    /flight
  autoload.php
.htaccess
composer.json
index.php

.htaccess

Pretty Urls로 들어오는 모든 요청을 index.php가 처리하게 하려면 프로젝트 루트에 .htaccess를 아래와 같이 작성한다.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

index.php

HTTP 요청의 진입점이 되는 index.php를 프로젝트 루트 디렉토리에 아래와 같이 작성한다.

require __DIR__ . '/vendor/autoload.php';

Flight::route('GET /hello/@name', array(new \HelloFlight\Controllers\HelloController(), 'world'));
Flight::start();
  • 가장 먼저 컴포저가 생성한 /vendor/autoload.php 오토로더를 호출한다.
  • Flight 클래스를 이용하여 라우팅을 설정한다. GET /hello/@name으로 들어오는 요청은 HelloController->world()가 처리하도록 한다.

HelloController.php

앞서 요청을 처리할 HelloController.php를 아래와 같이 작성한다.

<?php

namespace HelloFlight\Controllers;

class HelloController
{
    public function world($name)
    {
        \Flight::json(array('name' => $name));
    }
}
  • 앞서 주소 패턴을 살펴보면 /hello/@name이었다. @name을 호출 메써드의 아규먼트인 $name로 받는 것을 확인할 수 있다.
  • \Flight::json()은 데이터를 JSON으로 응답하고 요청을 종료한다.
  • 요청을 실행해 보기 전에 새로 작성한 클래스를 반영하기 위해 오토로더를 재생성한다.
$ composer dump-autoload --optimize
  • 실행 결과는 아래와 같다.
GET /hello/world

{
  "name": "world"
}

참고 글

댓글
댓글쓰기 폼