
라우팅 (Routing)
Slim Framework의 라우터는 Fast Route 구성 요소 위에 구축되었으며, 매우 빠르고 안정적입니다. 이 구성 요소를 사용하여 모든 라우팅을 수행하는 동안 앱(app)의 코어는 완전히 분리되었으며 인터페이스는 다른 라우팅 라이브러리를 사용할 수 있는 기반을 마련했습니다.
라우트 전략 (Route strategies)
라우트 콜백 서명은 경로 전략에 따라 결정됩니다. 기본적으로 Slim은 라우트 콜백이 요청, 응답 및 라우트 자리 표시자 인수의 배열을 수락할 것으로 예상합니다. 이를 RequestResponse 전략이라고 합니다. 그러나 다른 전략을 사용하여 예상 경로 콜백 서명을 변경할 수 있습니다. 예를 들어, Slim은 요청과 응답을 수용하고 각 경로 자리 표시자를 별도의 인수로 받아들이는 RequestResponseArgs라는 대체 전략을 제공합니다.
다음은 이 대체 전략을 사용하는 예입니다.
<?php
use Slim\Factory\AppFactory;
use Slim\Handlers\Strategies\RequestResponseArgs;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
/**
* Changing the default invocation strategy on the RouteCollector component
* will change it for every route being defined after this change being applied
*/
$routeCollector = $app->getRouteCollector();
$routeCollector->setDefaultInvocationStrategy(new RequestResponseArgs());
$app->get('/hello/{name}', function ($request, $response, $name) {
$response->getBody()->write($name);
return $response;
});
또는 라우트 별로 다른 호출 전략을 설정할 수 있습니다.
<?php
use Slim\Factory\AppFactory;
use Slim\Handlers\Strategies\RequestResponseArgs;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$routeCollector = $app->getRouteCollector();
$route = $app->get('/hello/{name}', function ($request, $response, $name) {
$response->getBody()->write($name);
return $response;
});
$route->setInvocationStrategy(new RequestResponseArgs());
Slim\Interfaces\InvocationStrategyInterface
를 구현하면 자신만의 경로 전략을 제공할 수 있습니다.
자리 표시자 라우트 (Route placeholders)
위에서 설명한 각 라우팅 메서드는 현재 HTTP 요청 URI에 대해 일치하는 URL 패턴을 허용합니다. 라우팅 패턴은 HTTP 요청 URI 세그먼트를 동적으로 일치시키기 위해 명명된 자리 표시자를 사용할 수 있습니다.
서식
경로 패턴 자리 표시자는 {
뒤에 자리 표시자 이름이 나오고 }
로 끝납니다. 다음은 ‘name’이라는 이름의 자리 표시자 예제입니다.
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
// ...
$app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response, array $args) {
$name = $args['name'];
$response->getBody()->write("Hello, $name");
return $response;
});
선택적 세그먼트 (Optional segments)
섹션을 선택사항으로 설정하려면 대괄호로 줄바꿈하면 됩니다.
$app->get('/users[/{id}]', function ($request, $response, array $args) {
// responds to both `/users` and `/users/123`
// but not to `/users/`
return $response;
});
중첩은 여러 선택적 매개 변수를 지원합니다.
$app->get('/news[/{year}[/{month}]]', function ($request, $response, array $args) {
// reponds to `/news`, `/news/2016` and `/news/2016/03`
// ...
return $response;
});
“무제한(Unlimited)” 옵션 매개 변수의 경우 다음을 수행할 수 있습니다.
$app->get('/news[/{params:.*}]', function ($request, $response, array $args) {
// $params is an array of all the optional segments
$params = explode('/', $args['params']);
// ...
return $response;
});
이 예에서 ‘/news/2016/03/20’의 URI는 세 가지 요소를 포함하는 ‘$params’ 배열이 됩니다.['2016', '03', '20']
.
정규표현식 일치 (Regular expression matching)
기본적으로 자리 표시자는 ‘{}’ 안에 작성되며 모든 값을 사용할 수 있습니다. 그러나 자리 표시자는 HTTP 요청 URI가 특정 정규식과 일치하도록 요구할 수도 있습니다. 현재 HTTP 요청 URI가 자리 표시자 정규식과 일치하지 않으면 경로가 호출되지 않습니다. 하나 이상의 숫자가 필요한 ‘id’라는 자리 표시자의 예입니다.
$app->get('/users/{id:[0-9]+}', function ($request, $response, array $args) {
// Find user identified by $args['id']
// ...
return $response;
});
라우트 이름 (Route. names)
Application routes can be assigned a name. This is useful if you want to programmatically generate a URL to a specific route with the RouteParser’s urlFor()
method. Each routing method described above returns a Slim\Route
object, and this object exposes a setName()
method.
응용 프로그램 라우터에 이름을 할당할 수 있습니다. 이것은 RouteParser의 urlFor()
메서드를 사용하여 특정 경로에 대한 URL을 프로그래밍 방식으로 생성하려는 경우에 유용합니다. 위에서 설명한 각 라우팅 메서드는 Slim\Route
객체를 반환하며 이 객체는 setName()
메서드를 표시합니다.
$app->get('/hello/{name}', function ($request, $response, array $args) {
$response->getBody()->write("Hello, " . $args['name']);
return $response;
})->setName('hello');
응용 프로그램 RouteParser의 ‘urlFor()’ 메서드를 사용하여 명명된 라우터에 대한 URL을 생성할 수 있습니다.
$routeParser = $app->getRouteCollector()->getRouteParser();
echo $routeParser->urlFor('hello', ['name' => 'Josh'], ['example' => 'name']);
// Outputs "/hello/Josh?example=name"
RouteParser의 urlFor()
메서드는 다음과 같은 세 가지 인수를 허용합니다.
$routeName
라우트 이름입니다. 라우트 이름은$route->setName('name')
을 통해 설정할 수 있습니다. 라우트 매핑 메서드는 ‘Route’ 인스턴스를 반환하므로 라우트 매핑 후 직접 이름을 설정할 수 있습니다. 예:$app->get('/', function () {...})->setName('name')
- 라우트 패턴 자리 표시자 및 대체 값의 연관 배열 ‘$data’.
- 생성된 URL에 추가할 쿼리 매개 변수의 연관 배열 ‘$queryParams’.
라우트 그룹 (Route groups)
라우트를 논리 그룹으로 구성하기 위해 Slim\App
은 group() 메서드도 제공합니다. 각 그룹의 라우트 패턴은 해당 그룹에 포함된 라우트 또는 그룹에 추가되며 그룹 패턴의 자리 표시자 인수는 궁극적으로 중첩된 라우트에서 사용할 수 있게 됩니다.
use Slim\Routing\RouteCollectorProxy;
// ...
$app->group('/users/{id:[0-9]+}', function (RouteCollectorProxy $group) {
$group->map(['GET', 'DELETE', 'PATCH', 'PUT'], '', function ($request, $response, array $args) {
// Find, delete, patch or replace user identified by $args['id']
// ...
return $response;
})->setName('user');
$group->get('/reset-password', function ($request, $response, array $args) {
// Route for /users/{id:[0-9]+}/reset-password
// Reset the password for user identified by $args['id']
// ...
return $response;
})->setName('user-password-reset');
});
그룹 패턴은 비어 있을 수 있으므로 공통 패턴을 공유하지 않는 라우트의 논리적 그룹화가 가능합니다.
use Slim\Routing\RouteCollectorProxy;
// ...
$app->group('', function (RouteCollectorProxy $group) {
$group->get('/billing', function ($request, $response, array $args) {
// Route for /billing
return $response;
});
$group->get('/invoice/{id:[0-9]+}', function ($request, $response, array $args) {
// Route for /invoice/{id:[0-9]+}
return $response;
});
})->add(new GroupMiddleware());
그룹 클로저 내부에서 Slim은 클로저를 컨테이너 인스턴스에 바인딩합니다.
- 라우트 내부 클로저,
$this
는 ‘Psr\Container\ContainerInterface’의 인스턴스에 바인딩되어 있습니다.
라우트 미들웨어 (Route middleware)
또한 모든 라우트 또는 라우트 그룹에 미들웨어를 연결할 수 있습니다.
use Slim\Routing\RouteCollectorProxy;
// ...
$app->group('/foo', function (RouteCollectorProxy $group) {
$group->get('/bar', function ($request, $response, array $args) {
// ...
return $response;
})->add(new RouteMiddleware());
})->add(new GroupMiddleware());
라우트 식 캐시 (Route expressions caching)
RouteCollector::setCacheFile()
을 통해 라우터 캐시를 활성화할 수 있습니다. 아래 예제를 참조하십시오.
<?php
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
/**
* To generate the route cache data, you need to set the file to one that does not exist in a writable directory.
* After the file is generated on first run, only read permissions for the file are required.
*
* You may need to generate this file in a development environment and comitting it to your project before deploying
* if you don't have write permissions for the directory where the cache file resides on the server it is being deployed to
*/
$routeCollector = $app->getRouteCollector();
$routeCollector->setCacheFile('/path/to/cache.file');