11

ミドルウェア クラスで現在の I ルートの名前を取得したい。以前 (Slim 2.*) では、次のように現在のルートを取得できました。

$route = $this->app->router->getCurrentRoute();

ただし、この機能は Slim の 3.0 バージョンでは削除されています。__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か?

4

5 に答える 5

11
$request->getUri()->getPath()

でさえ、現在のルートを取得しmiddlewareます。

于 2016-09-21T15:12:28.723 に答える
10

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.
}
于 2016-08-24T10:09:41.907 に答える
1

以下は、あなたが必要とする十分な情報を提供しますか、それとも routeInfo の「request」ビットも必要ですか?

$app->getContainer()->get('router')->dispatch($req);

「リクエスト」ビットも必要な場合は、同じことを手動で行う必要があります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()];

お役に立てれば。

于 2015-12-27T04:50:35.430 に答える