Slim Framework 매뉴얼 Routing (라우팅) #1 라우트 만들기, 라우트 콜백, 리다이렉션 헬퍼

라우팅 (Routing)

Slim Framework의 라우터는 Fast Route 구성 요소 위에 구축되었으며, 매우 빠르고 안정적입니다. 이 구성 요소를 사용하여 모든 라우팅을 수행하는 동안 앱(app)의 코어는 완전히 분리되었으며 인터페이스는 다른 라우팅 라이브러리를 사용할 수 있는 기반을 마련했습니다.

라우트를 만드는 방법 (How to create routes)

Slim\App 인스턴스에서 프록시 메서드를 사용하여 응용 프로그램 경로(routes)를 정의할 수 있습니다. Slim Framework는 가장 널리 사용되는 HTTP 메서드를 제공합니다.

GET 라우트 (GET Route)

Slim 애플리케이션의 GET() 메서드로 GET HTTP 요청만 처리하는 라우트를 추가할 수 있습니다. 두 가지 인수를 수용합니다.

  1. 라우트 패턴 (선택 사항으로 명명된 자리 표시자 포함)
  2. 라우트 콜백
$app->get('/books/{id}', function ($request, $response, array $args) {
    // Show book identified by $args['id']
});

POST 라우트 (POST Route)

Slim 응용 프로그램의 post() 메서드로 POST HTTP 요청만 처리하는 라우트를 추가할 수 있습니다. 두 가지 인수를 수용합니다.

  1. 라우트 패턴(선택 사항으로 명명된 자리 표시자 포함)
  2. 라우트 콜백
$app->post('/books', function ($request, $response, array $args) {
    // Create new book
});

PUT 라우트 (PUT Route)

Slim 애플리케이션의 put() 메서드로 PUT HTTP 요청만 처리하는 라우트를 추가할 수 있습니다. 두 가지 인수를 수용합니다.

  1. 라우트 패턴(선택 사항으로 명명된 자리 표시자 포함)
  2. 라우트 콜백
$app->put('/books/{id}', function ($request, $response, array $args) {
    // Update book identified by $args['id']
});

DELETE 라우트 (DELETE Route)

Slim 애플리케이션의 delete() 메소드로 DELETE HTTP 요청만 처리하는 라우트를 추가할 수 있습니다. 두 가지 인수를 수용합니다.

  1. 라우트 패턴(선택 사항으로 명명된 자리 표시자 포함)
  2. 라우트 콜백
$app->delete('/books/{id}', function ($request, $response, array $args) {
    // Delete book identified by $args['id']
});

OPTIONS 라우트 (OPTIONS Route)

Slim 애플리케이션의 OPTIONS() 방법으로 OPTIONS HTTP 요청만 처리하는 라우트를 추가할 수 있습니다. 두 가지 인수를 수용합니다.

  1. 라우트 패턴(선택 사항으로 명명된 자리 표시자 포함)
  2. 라우트 콜백
$app->options('/books/{id}', function ($request, $response, array $args) {
    // Return response headers
});

PATCH 라우트 (PATCH Route)

Slim 애플리케이션의 patch() 메소드로 PATCH HTTP 요청만 처리하는 라우트를 추가할 수 있습니다. 두 가지 인수를 수용합니다.

  1. 라우트 패턴(선택 사항으로 명명된 자리 표시자 포함)
  2. 라우트 콜백
$app->patch('/books/{id}', function ($request, $response, array $args) {
    // Apply changes to book identified by $args['id']
});

Any 라우트 (Any Route)

Slim 응용 프로그램의 any() 메서드를 사용하여 모든 HTTP 요청 메서드를 처리하는 라우트를 추가할 수 있습니다. 두 가지 인수를 수용합니다.

  1. 라우트 패턴(선택 사항으로 명명된 자리 표시자 포함)
  2. 라우트 콜백
$app->any('/books/[{id}]', function ($request, $response, array $args) {
    // Apply changes to books or book identified by $args['id'] if specified.
    // To check which method is used: $request->getMethod();
});

두 번째 파라미터는 콜백입니다. Closure 대신 ‘_invoke()’ 메서드를 구현하는 클래스를 지정할 수 있습니다. 그런 다음 다른 곳에서 매핑을 수행할 수 있습니다.

$app->any('/user', 'MyRestfulController');

사용자 지정 라우트 (Custom Route)

Slim 애플리케이션의 map() 메서드를 사용하여 여러 HTTP 요청 메서드를 처리하는 라우트를 추가할 수 있습니다. 다음의 세 가지 인수를 수용한다.

  1. HTTP 메소드 배열
  2. 경로 패턴(선택 사항으로 지정된 자리 표시자 포함)
  3. 경로 콜백
$app->map(['GET', 'POST'], '/books', function ($request, $response, array $args) {
    // Create new book or list all books
});

라우트 콜백 (Route callbacks)

위에서 설명한 각 라우팅 메서드는 콜백 루틴을 최종 인수로 받아들입니다. 이 인수는 어떤 PHP도 호출할 수 있으며, 기본적으로 3개의 인수를 허용합니다.

  • Request(요청) 첫 번째 인수는 HTTP 요청(request)를 나타내는 Psr\Http\Message\ServerRequestInterface 객체입니다.
  • Response(응답) 두 번째 인수는 HTTP 응답(response)을 나타내는 Psr\Http\Message\ResponseInterface 객체입니다.
  • Arguments(인수) 세 번째 인수는 현재 경로의 명명된 자리 표시자에 대한 값을 포함하는 연관 배열입니다.

응답에 내용 쓰기 (Writing content to the response)

HTTP 응답(response)에 내용을 쓸 수 있는 두 가지 방법이 있습니다. 먼저 경로 콜백에서 echo() 콘텐츠를 간단히 사용할 수 있습니다. 이 내용은 현재 HTTP 응답 오브젝트에 추가됩니다. 둘째, Psr\Http\Message\ResponseInterface 객체를 반환할 수 있습니다.

클로저 바인딩 (Closure binding)

dependency containerClosure 인스턴스를 경로 콜백으로 사용하는 경우 Closure 상태는 container 인스턴스에 바인딩됩니다. 즉, $this 키워드를 통해 Closure의 DI 컨테이너 인스턴스 inside에 액세스할 수 있습니다.

$app->get('/hello/{name}', function ($request, $response, array $args) {
    // Use app HTTP cookie service
    $this->get('cookies')->set('name', [
        'value' => $args['name'],
        'expires' => '7 days'
    ]);
});

경고!

슬림은 정적(static) 클로저(closure)를 지지하지 않는다.

리디렉션 헬퍼 (Redirect helper)

Slim 애플리케이션의 redirect() 방법으로 GET HTTP 요청을 다른 URL로 리디렉션하는 경로를 추가할 수 있습니다. 다음의 세 가지 인수를 수용합니다.

  1. ‘from’을 리디렉션할 라우트 패턴 (지정된 자리 표시자 옵션 포함)
  2. 문자열 또는 Psr\Http\Message\UriInterface일 수 있는 ‘to’로 리디렉션할 위치
  3. 사용할 HTTP 상태 코드( 선택 사항(optional), 설정되지 않은 경우 ‘302’)
$app->redirect('/books', '/library', 301);

resirect() 경로는 요청된 상태 코드와 두 번째 인수로 설정된 Location 헤더로 응답합니다.