Slim3に「Retrieving Current Route」というページがあるのに気がついたので、簡単に紹介します。
ミドルウェア内で、ルートパターンにマッチした結果にアクセスする方法です。
普通は、ルートパラメター(ルート内の{name}
の部分)は、$args
に入ってきます。
$app->get('user/{name}', function($request, $response, $args) {
$name = $args['name']; // 1. ルートパラメター:name
// $nameを使って、適当に処理
$response->getBody()->write("<h1>Hello {$name}</h1>");
return $response;
});
では、ミドルウェアの場合は、どうやってアクセスするでしょう?
ミドルウェアだと$args
はありません。代わりに$next
がありますが。
その場合、$request
からroute
を取り出して使えるそうです。
use Slim\App;
use Slim\Exception\NotFoundException;
use Slim\Http\Request;
use Slim\Http\Response;
// 1. まず、設定内のフラグを追加!
$app = new App([
'settings' => [
// Only set this if you need access to route within middleware
'determineRouteBeforeAppMiddleware' => true
]
]);
// ルートとミドルウェアの設定
$app->get('user/{name}', function($request, $response, $args) {
$name = $args['name']; // 4. ルートパラメター:name
// $nameを使って、適当に処理
$response->getBody()->write("<h1>Hello {$name}</h1>");
return $response;
})->add(function (Request $request, Response $response, callable $next) {
// $routeを取得しておく
$route = $request->getAttribute('route'); // 2. route取り出す
$arguments = $route->getArguments();
$arguments['name'] .= ' :touched!'; // 3. 名前に細工しとく
$route->setArguments($arguments);
return $next($request, $response);
});
大事なことは、最初にsettings
のdetermineRouteBeforeAppMiddleware
フラグをtrue
にしておくこと。これを唱えていないと、ミドルウェアを実行した後にルートのマッチングが行われるとのこと。
ルートパラメーターを変更したい場合は、route
のsetArgument(s)
を使えます。