невозможно получить имя маршрута из URL в zend framework 2

#zend-framework2 #routes

#zend-фреймворк2 #маршруты

Вопрос:

Я использую Zend Framework 2, это мой код:

 $prevsingletrackurl = $this->getRequest()->getHeader('Referer')->getUri();
 

Из этого кода, который определен в методе контроллера, я получаю предыдущий URL-адрес, теперь мне нужно узнать некоторую информацию об этом из этого, он содержит маршрут, контроллер, метод для моего собственного требования.

Ответ №1:

Вы можете использовать сам стек маршрутов, чтобы попытаться сопоставить его. Он вернет вам соответствие маршрута, если объект запроса соответствует:

 use ZendMvcRouterRouteMatch;

$referer = $this->getRequest()->getHeader('Referer')->getUri();
$request = clone $this->getRequest();
$request->setUri($referer);

$match = $routeStack->match($request);
if ($match instanceof RouteMatch) {
    $route = $match->getMatchedRouteName();
}
 

Вы можете получить доступ к стеку маршрутов («маршрутизатору») из локатора служб; в корневом локаторе служб он зарегистрирован как «Маршрутизатор». Вы можете внедрить стек маршрутов на своей фабрике. Например, в контроллере:

 use MyModuleControllerMyController;
use ZendServiceManagerFactoryInterface;
use ZendServiceManagerServiceLocatorInterface;

class MyControllerFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $sl)
    {
        $router     = $sl->getServiceLocator()->get('Router');
        $controller = new MyController($router);

        return $controller;
    }
}
 

Используйте его в своем контроллере следующим образом:

 use ZendMvcControllerAbstractActionController;
use ZendMvcRouterHttpTreeRouteStack;

class MyController extends AbstractActionController
{
    protected $router;

    public function __construct(TreeRouteStack $router)
    {
        $this->router = $router;
    }

    protected function getRouter()
    {
        return $this->router;
    }
}
 

Ответ №2:

Этот код я использовал внутри метода действия контроллера

$request = $this->GetRequest(); $getHeaderReferer=$request->getHeader(‘Реферер’);

       if (!empty($getHeaderReferer))
      {


           $prevsingletrackurl = $getHeaderReferer->getUri(); //  get previous url
             //echo "<br>previous usrl=>".$prevsingletrackurl;        
           $controller = $this->getEvent()->getRouteMatch()->getParam('controller'); // get controller name




             //**** code to get previous url route , controller name , action/method name starts


               $request->setUri($prevsingletrackurl);
               $router =$this->getServiceLocator()->get('Router');// this gives instance of /Zend/Mv/Router/Http/TreeRouteStack 

               //echo "<br>router=>".$router->toString();
               $routeMatch = $router->match($request); // this gives instance of /Zend/Mv/Router/Http/RouteMatch

               $routename="";




               if( $routeMatch instanceof RouteMatch )
               {

                     $urlwholeroutedataAr=$routeMatch->getParams();

                    if(!empty($urlwholeroutedataAr))
                    {
                         $controllerdata=$urlwholeroutedataAr['controller'];
                         $actionmethod=$urlwholeroutedataAr['action'];

                         if(array_key_exists('trackdata',$urlwholeroutedataAr))
                         {
                            $trackdata=$urlwholeroutedataAr['trackdata'];
                         }

                          $controllerdataAr=explode("\",$controllerdata);

                          if(count($controllerdataAr)>0)
                          {
                            $controllername=end($controllerdataAr);
                          }



                    }

                     $routename=$routeMatch->getMatchedRouteName();
                     }
}