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
- 손가락귀신
정신 못차리면, 벌 받는다.