ミドルウェアクラスで現在ルーティングしている名前を取得したい。以前(Slim 2. *)では、次のように現在のルートをフェッチできました。
$route = $this->app->router->getCurrentRoute();
ただし、この機能は3.0バージョンのSlimでは削除されています。 ___invoke
_の_Slim\App
_メソッドで次のコードを見つけました。
_ // Get the route info
$routeInfo = $request->getAttribute('routeInfo');
/** @var \Slim\Interfaces\RouterInterface $router */
$router = $this->container->get('router');
// If router hasn't been dispatched or the URI changed then dispatch
if (null === $routeInfo || ($routeInfo['request'] !== [$request->getMethod(), (string) $request->getUri()])) {
$request = $this->dispatchRouterAndPrepareRoute($request, $router);
$routeInfo = $request->getAttribute('routeInfo');
}
_
これは、現在のルートが属性routeInfo
としてRequest
に保存されていることを示しています。しかし、属性が設定される前に($this->dispatchRouterAndPrepareRoute($request, $router);
メソッドによって)カスタムミドルウェアクラスが呼び出されているようです。 $request->getAttribute('routeInfo')
を呼び出すとNULL
に解決されるためです。
だから私の質問は;ミドルウェア関数/クラスから現在のルート(またはルートの名前)を取得するにはどうすればよいですか?
または、上記のコードを_Slim\App
_からコピーする必要がありますか?
Slim3の場合、ミドルウェア内からルーティング情報を取得する方法を示す例を次に示します。これは、実際には以前の回答を組み合わせたものです。
_<?php
$slimSettings = array('determineRouteBeforeAppMiddleware' => true);
// This is not necessary for this answer, but very useful
if (ENVIRONMENT == "dev")
{
$slimSettings['displayErrorDetails'] = true;
}
$slimConfig = array('settings' => $slimSettings);
$app = new \Slim\App($slimConfig);
$myMiddleware = function ($request, $response, $next) {
$route = $request->getAttribute('route');
$routeName = $route->getName();
$groups = $route->getGroups();
$methods = $route->getMethods();
$arguments = $route->getArguments();
print "Route Info: " . print_r($route, true);
print "Route Name: " . print_r($routeName, true);
print "Route Groups: " . print_r($groups, true);
print "Route Methods: " . print_r($methods, true);
print "Route Arguments: " . print_r($arguments, true);
};
// Define app routes
$app->add($myMiddleware);
$app->get('/', function (\Slim\Http\Request $request, Slim\Http\Response $response, $args) {
# put some code here....
})
_
私の場合、ユーザーが特定のルートにログインしていることを確認するミドルウェアを追加し、そうでない場合はログインページにリダイレクトしたいと思いました。これを行う最も簡単な方法は、次のようなルートで->setName()
を使用することでした。
_$app->get('/', function (\Slim\Http\Request $request, Slim\Http\Response $response, $args) {
return $response->withRedirect('/home');
})->setName('index');
_
次に、このルートが一致した場合、ミドルウェアの例の_$routeName
_は_"index"
_になります。次に、認証を必要としないルートの配列リストを定義し、現在のルートがそのリストに含まれているかどうかを確認しました。例えば。
_if (!in_array($routeName, $publicRoutesArray))
{
# @TODO - check user logged in and redirect if not.
}
_
$request->getUri()->getPath()
middleware
でも、現在のルートを取得します。
どうやら、この設定でミドルウェアに入る前にルートを決定するようにSlimを構成できます。
$app = new Slim\App([
'settings' => [
'determineRouteBeforeAppMiddleware' => true,
]
]);
これがどのような影響を与えるかはわかりませんが、私にとってはうまくいきます:)
以下は、必要な十分な情報を提供しますか、それともrouteInfoの「request」ビットも必要ですか?
$app->getContainer()->get('router')->dispatch($req);
'request'ビットも必要な場合は、dispatchRouterAndPrepareRoute
と同じことを手動で行う必要があります。
if ($routeInfo[0] === Dispatcher::FOUND) {
$routeArguments = [];
foreach ($routeInfo[2] as $k => $v) {
$routeArguments[$k] = urldecode($v);
}
$route = $router->lookupRoute($routeInfo[1]);
$route->prepare($request, $routeArguments);
// add route to the request's attributes in case a middleware or handler needs access to the route
$request = $request->withAttribute('route', $route);
}
$routeInfo['request'] = [$request->getMethod(), (string) $request->getUri()];
お役に立てれば。
Slim Framework3のミドルウェアで現在のルートを取得する方法は次のとおりです。
_$routeInfo = $request->getAttribute('routeInfo');
_
ミドルウェアの__invoke()
関数内でこれを使用する必要があることに注意してください。使用例は次のとおりです。
_public function __invoke($request, $response, $next)
{
....
$routeInfo = $request->getAttribute('routeInfo');
....
}
_
$ routeInfoには、次のようなオブジェクトが含まれます。
_{
"0": 1,
"1": "route6",
"2": {
"name": "loremipsum"
},
"request": [
"POST",
"http://example.org/loremipsum"
]
}
_