2015-12-27 8 views
7

मैं मिडलवेयर क्लास में वर्तमान I रूट का नाम प्राप्त करना चाहता हूं। इससे पहले (स्लिम 2 में *) आप वर्तमान मार्ग तो जैसे लाने सकता है:स्लिम 3 मिडलवेयर में वर्तमान मार्ग प्राप्त करें

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

लेकिन इस समारोह स्लिम के 3.0 संस्करण में हटा दिया गया है। मैं Slim\App की __invoke विधि में निम्नलिखित कोड मिल गया है:

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

यह बताता है कि वर्तमान मार्ग Request में विशेषता routeInfo के रूप में जमा है। लेकिन ऐसा लगता है कि मेरी कस्टम मिडलवेयर क्लास को विशेषता सेट करने से पहले बुलाया जाता है ($this->dispatchRouterAndPrepareRoute($request, $router); विधि द्वारा)। क्योंकि $request->getAttribute('routeInfo') पर कॉल करने से NULL पर हल हो जाता है।

तो मेरा सवाल है; मैं मिडलवेयर फ़ंक्शन/क्लास से वर्तमान मार्ग (या मार्ग का नाम) कैसे प्राप्त कर सकता हूं?

या मुझे सिर्फ Slim\App से ऊपर दिए गए कोड का टुकड़ा कॉपी करना चाहिए?

+0

मुझे भी मध्य मार्ग में वर्तमान मार्ग प्राप्त करने में परेशानी हो रही है। मैंने 'setRouteBeforeAppMiddleware' => true' सेट किया है और जब मैं '$ रूट = $ अनुरोध-> getAttribute ('मार्ग') प्राप्त करता हूं; 'मुझे ऑब्जेक्ट (स्लिम \ रूट) मिलता है, लेकिन जब मैं' $ रूटनाम करता हूं = $ रूट-> getName(); 'मैं शून्य हो जाता हूं। किसी के पास कोई सुझाव है? –

+1

क्या आपने 'setName()' विधि के माध्यम से मार्ग का नाम दिया था? (https://www.slimframework.com/docs/objects/router.html#route-names) –

+0

Thx @Wessel। मार्ग घोषित करने के बाद समस्या 'लापता') 'विधि गायब थी। –

उत्तर

7

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

मेरे मामले में, मैं मिडलवेयर कि यह सुनिश्चित करना होगा उपयोगकर्ता कुछ मार्गों पर में लॉग इन किया गया था, और उन्हें प्रवेश पृष्ठ पर पुनर्निर्देशित अगर वे नहीं थे जोड़ना चाहते थे।

$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

क्या निम्नलिखित आपको आवश्यक जानकारी प्रदान करता है या आपको रूटइन्फो में 'अनुरोध' बिट की भी आवश्यकता है?

$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

उत्तर देने के लिए धन्यवाद! यह मेरी समस्या हल करता है, लेकिन यह सही नहीं लगता क्योंकि यह स्लिम 2. * दृष्टिकोण से अधिक जटिल समाधान है। –

5

जाहिर है यदि आप इस सेटिंग के साथ मिडलवेयर में जाने से पहले मार्ग निर्धारित करने के लिए स्लिम कॉन्फ़िगर कर सकते हैं:

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

मुझे यकीन है कि प्रभाव की किस तरह यह है नहीं कर रहा हूँ, लेकिन यह मेरे लिए काम करता :)

+1

एक बार ऐसा करने के बाद, @SamarRizvi उत्तर का उपयोग करके '$ routInfo = $ request-> getAttribute (' routeInfo ') का उपयोग करने के साथ काम करता है;' मिडलवेयर के अंदर। इसके बिना, $ routInfo कुछ भी नहीं है। – Programster

0

यहाँ आप स्लिम ढांचे 3 में अपने मिडलवेयर में मौजूदा मार्ग पहुंच सकते हैं:

$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" 
    ] 
    } 
3
$request->getUri()->getPath() 

वर्तमान मार्ग, middleware में भी प्राप्त करें।

संबंधित मुद्दे