2015-12-27 13 views
7

ミドルウェアクラスで現在の私のルートの名前を取得したいと思います。スリム3ミドルウェアで現在のルートを取得

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

をしかし、この機能は、スリムの3.0バージョンでは削除されました。以前は(スリム2に*)あなたはそうのような現在のルートを取得することができます。私はSlim\App__invoke方法に次のコードを見つけた:これは、現在のルートはRequestで属性routeInfoとして格納されていることを示し

// 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'); 
    } 

。しかし、私のカスタムミドルウェアクラスは、属性が設定される前に($this->dispatchRouterAndPrepareRoute($request, $router);メソッドによって)呼び出されたようです。 $request->getAttribute('routeInfo')NULLに解決されるためです。

私の質問です。ミドルウェア機能/クラスから現在のルート(またはルートの名前)を取得するにはどうすればよいですか?

また、上記のコードをSlim\Appからコピーするだけですか?

+0

ミドルウェアで現在のルートを取得するのにも問題があります。私は '' routesRequestBeforeAppMiddleware '=> true'を設定しました。 '$ route = $ request-> getAttribute(' route ');'オブジェクトを取得しましたが(Slim \ Route)、 '$ routeName = $ route-> getName(); 'nullが返されます。誰でも何か提案がありますか? –

+1

'setName()'メソッドでルート名を付けましたか? (https://www.slimframework.com/docs/objects/router.html#route-names) –

+0

Thx @Wessel。問題は、ルートを宣言した後に 'setName()'メソッドが見つからないという問題でした。 –

答えて

7

を、ここではどのように実際にあるミドルウェアの中からルーティング情報を取得する方法を示す例です。以前の回答の組み合わせ私の場合は

<?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.... 
}) 

、私は、ユーザーが特定の路線にログインし、彼らがなかった場合は、ログインページにリダイレクトして確実にするミドルウェアを追加したいです。このルートがマッチした場合

$app->get('/', function (\Slim\Http\Request $request, Slim\Http\Response $response, $args) { 
    return $response->withRedirect('/home'); 
})->setName('index'); 

はその後、ミドルウェアの例では$routeName"index"次のようになります。私はこれを行う最も簡単な方法はそうのようなルートで->setName()を使用することがわかりました。次に、認証を必要としないルートのアレイリストを定義し、現在のルートがそのリストにあるかどうかを確認しました。例えば。

if (!in_array($routeName, $publicRoutesArray)) 
{ 
    # @TODO - check user logged in and redirect if not. 
} 
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()]; 

は、この情報がお役に立てば幸いです。

+0

お返事ありがとうございます!これは私の問題を解決しますが、それはSlim 2. *アプローチよりも複雑な解決策なので、気分が悪いです。 –

5

どうやらあなたは、この設定をミドルウェアに入る前にルートを決定するためにスリムを設定することができます。

$app = new Slim\App([ 
    'settings' => [ 
     'determineRouteBeforeAppMiddleware' => true, 
    ] 
]); 

私はこれが与える影響のどのようなわからないんだけど、それは私の作品:)

ここ
+1

これを行うと、@SamarRizviを使ってanswerが動作し、ミドルウェア内部で '$ routeInfo = $ request-> getAttribute( 'routeInfo');これがなければ、$ routeInfoは何もありません。 – Programster

0

あなたはスリムなフレームワーク3にあなたのミドルウェアで、現在のルートを取得する方法は次のとおりです。あなたはこの内部__invoke()機能を使用する必要があります

$routeInfo = $request->getAttribute('routeInfo'); 

注意あなたのミドルウェア。

public function __invoke($request, $response, $next) 
    { 
     .... 
     $routeInfo = $request->getAttribute('routeInfo'); 
     .... 
    } 

$ routeInfoが、その後のようなオブジェクトを含まなければならない:ここでは使用例ですSlim3については

{ 
    "0": 1, 
    "1": "route6", 
    "2": { 
     "name": "loremipsum" 
    }, 
    "request": [ 
     "POST", 
     "http://example.org/loremipsum" 
    ] 
    } 
3
$request->getUri()->getPath() 

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

関連する問題