Slim Router

Programming/Slim 2016. 3. 6. 00:22

Slim 프레임워크의 라우터는 nikic/fastroute 컴포넌트로, 매우 빠르고 안정적이다.



라우트 생성하기


\Slim\App 인스턴스에서 프록시 메소드를 사용하여 어플리케이션 라우트를 정의할 수 있다.

Slim 프레임워크는 가장 많이 사용하는 HTTP 메소드들에 대한 메소드를 제공한다.


GET Route

Slim 어플리케이션의 get(pattern, callback) 메소드로 GET HTTP 요청을 다루는 라우트를 추가한다.

1
2
3
4
5

$app = new \Slim\App();
$app->get('/books/{id}'function ($request$response$args) {
    // Show book identified by $args['id']
});
cs


POST Route

Slim 어플리케이션의 post(pattern, callback) 메소드로 POST HTTP 요청을 다루는 라우트를 추가한다.

1
2
3
4
5

$app = new \Slim\App();
$app->post('/books'function ($request$response$args) {
    // Create new book
});
cs


PUT Route

Slim 어플리케이션의 put(pattern, callback) 메소드로 PUT HTTP 요청을 다루는 라우트를 추가한다.

1
2
3
4
5

$app = new \Slim\App();
$app->put('/books/{id}'function ($request$response$args) {
    // Update book identified by $args['id']
});
cs


DELETE Route

Slim 어플리케이션의 delete(pattern, callback) 메소드로 DELETE HTTP 요청을 다루는 라우트를 추가한다.

1
2
3
4
5

$app = new \Slim\App();
$app->delete('/books/{id}'function ($request$response$args) {
    // Delete book identified by $args['id']
});
cs


OPTIONS  Route

Slim 어플리케이션의 options(pattern, callback) 메소드로 OPTIONS HTTP 요청을 다루는 라우트를 추가한다.

1
2
3
4
5

$app = new \Slim\App();
$app->options('/books/{id}'function ($request$response$args) {
    // Return response headers
});
cs


PATCH Route

Slim 어플리케이션의 patch(pattern, callback) 메소드로 PATCH HTTP 요청을 다루는 라우트를 추가한다.

1
2
3
4
5

$app = new \Slim\App();
$app->patch('/books/{id}'function ($request$response$args) {
    // Apply changes to book identified by $args['id']
});
cs


Any Route

Slim 어플리케이션의 any(pattern, callback) 메소드로 모든 HTTP 요청을 다루는 라우트를 추가한다.

1
2
3
4
5
6

$app = new \Slim\App();
$app->any('/books/[{id}]'function ($request$response$args) {
    // Apply changes to books or book identified by $args['id'] if specified.
    // To check which method is used: $request->getMethod();
});
cs


두번째 매개변수에 콜백 클로저 대신 __invoke() 구현이 필요한 클래스를 지정할 수 있다.


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


Custom Route

Slim 어플리케이션의 map(array HTTP method, pattern, callback) 메소드로 여러 HTTP 요청을 다루는 라우트를 추가한다.


1
2
3
4
5

$app = new \Slim\App();
$app->map(['GET''POST'], '/books'function ($request$response$args) {
    // Create new book or list all books
});
cs



라우트 콜백


위의 각 라우팅 메소드는 마지막 매개변수로 콜백 루틴을 가진다.

이 매개변수는 PHP 에서 호출 가능한 것이면 무엇이든 될 수 있으며, 기본적으로 세개의 매개변수를 가진다.

  • Request : 첫번째 매개변수로, 현재 HTTP 요청을 나타내는 Psr\Http\Message\ServerRequestInterface 객체
  • Response : 두번째 매개변수로, 현재 HTTP 응답을 나타내는 Psr\Http\Message\ResponseInterface  객체
  • Arguments : 세번째 매개변수로, 현재 라우트 예상 값을 포함하는 배열


응답에 내용 작성

HTTP 응답에 내용을 작성하는 데는 두가지 방법이 있다.

  • 라우트 콜백에 HTTP 응답 객체의 echo() 로 내용을 추가한다.
  • Psr\Http\Message\ResponseInterface 객체를 반환한다.


클로저 바인딩

라우트 콜백에 Closure 인스턴스를 사용한다면, 클로저의 상태는 Container 인스턴스에 바인딩된다.

이 말은, $this 키워드를 통해 Closure 내부의 DI 컨테이너에 접근한다는 것이다.



라우트 전략


라우트 콜백 매개변수는 라우트 전략(strategies)으로부터 결정된다.

기본적으로 Slim 은 Request, Response, Placeholder 배열로 라우트 콜백을 받는다. 이것을 RequestResponse 전략이라고 부른다.

그러나, 단순히 다른 전략을 사용하여 라우트 콜백 매개변수를 바꿀 수 있다.

예를 들어, Slim 은 request 와 response, 별도의 매개변수로 각 라우트 placeholder 를 매개변수로 하는 RequestResponseArgs 라는 대안적인 전략을 제공한다.

아래의 예는 대안적인 전략을 사용한 예이다; 단순히 기본 \Slim\Container 로 제공된 foundHandler 의존성을 대신한다.


1
2
3
4
5
6
7
8
9
$c = new \Slim\Container();
$c['foundHandler'= function() {
    return new \Slim\Handlers\Strategies\RequestResponseArgs();
};
 
$app = new \Slim\App($c);
$app->get('/hello/{name}', function ($request$response$name) {
    return $response->write($name);
});
cs


/hello/foo 로 접근할 경우 기본적으로 $name 은 array('name'=>'foo') 처럼 배열로 넘기겠지만,
위처럼 \Slim\Interfaces\InvocationStrategyInterface 를 구현하여 $name 이 'foo' 를 바로 넘기는 라우트 전략을 제공할 수 있다.



라우트 placeholders


위의 각 라우트 메소드는 HTTP 요청 URI 와 일치되는 URL 패턴 매개변수를 가진다.

라우트 패턴은 HTTP 요청 URI 를 동적으로 매칭하기 위해 placeholder 를 사용할 것이다.


형식

라우트 패턴 placeholder 는 중괄호 { 로 시작하고, placeholder 이름이 오고, 중괄호 } 로 닫는다.


1
2
3
4
$app = new \Slim\App();
$app->get('/hello/{name}', function ($request$response$args) {
    echo "Hello, " . $args['name'];
});
cs


정규 표현식 매칭

기본적으로 placeholder 는 {} 안에 쓰이고, 어떤 값도 들어갈 수 있다.

그러나 placeholder 는 특정 정규 표현식과 매칭하기 위해 HTTP 요청 URI 를 필요로 할 수도 있다.

HTTP 요청 URI 가 placeholder 의 정규 표현식과 일치하지 않으면, 라우트는 호출되지 않는다.

아래는 10진수를 요구하는 id 라는 이름의 placeholder 예이다.


1
2
3
4
5

$app = new \Slim\App();
$app->get('/users/{id:[0-9]+}'function ($request$response$args) {
    // Find user identified by $args['id']
});
cs



라우트 이름


어플리케이션 라우트는 이름을 할당할 수 있다.

라우트의 pathFor() 메소드는 특정 라우트에 URL 을 계획적으로 생성하는데 유용하다.

위에 설명된 각 라우트 메소드는 \Slim\Route 객체를 반환하고, 이 객체는 setName() 메소드를 노출한다.


1
2
3
4
$app = new \Slim\App();
$app->get('/hello/{name}', function ($request$response$args) {
    echo "Hello, " . $args['name'];
})->setName('hello');
cs


어플리케이션 라우트의 pathFor(name, rount pattern array or values) 메소드로 이름 지어진 라우트에 URL 을 생성할 수 있다.


1
2
3
4
5

echo $app->getContainer()->get('router')->pathFor('hello', [
    'name' => 'Josh'
]);
// Outputs "/hello/Josh"
cs



라우트 그룹


논리적인 그룹으로 라우트를 구성하기 위해, \Slim\App 는 group() 메소드도 제공한다.

각 그룹의 라우트 패턴은 그 안에 포함되는 라우트나 그룹을 덧붙이고, 그룹 패턴의 모든 placeholder 매개변수는 궁극적으로 중첩된 라우트에 사용 가능하게 된다.


1
2
3
4
5
6
7
8
9
10
11

$app = new \Slim\App();
$app->group('/users/{id:[0-9]+}'function () {
    $this->map(['GET''DELETE''PATCH''PUT'], ''function ($request$response$args) {
        // Find, delete, patch or replace user identified by $args['id']
    })->setName('user');
    $this->get('/reset-password'function ($request$response$args) {
        // Route for /users/{id:[0-9]+}/reset-password
        // Reset the password for user identified by $args['id']
    })->setName('user-password-reset');
});
cs


그룹 클로져 안에 $this 는 $app 을 가리키는 것에 유의하라.

Slim 은 라우트 콜백을 사용하는 것 처럼 어플리케이션 인스턴스에 클로저를 바인딩한다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,