#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();
}
}