web-dev-qa-db-ja.com

Slim3はミドルウェアで現在のルートを取得します

ミドルウェアクラスで現在ルーティングしている名前を取得したい。以前(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_からコピーする必要がありますか?

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.
}
_
10
Programster
$request->getUri()->getPath()

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

7
Anuga

どうやら、この設定でミドルウェアに入る前にルートを決定するように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()];

お役に立てれば。

1
binarix

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"
    ]
  }
_
0
Samar Rizvi