Как получить имя контроллера и действия в zf2

в zf1 мы можем получить имя контроллера и действия, используя

$controller = $this->getRequest()->getControllerName(); $action = $this->getRequest()->getActionName(); 

Как мы можем добиться этого в zf2?

ОБНОВЛЕНИЕ: я попытался заставить их использовать

 echo $this->getEvent()->getRouteMatch()->getParam('action', 'NA'); echo $this->getEvent()->getRouteMatch()->getParam('controller', 'NA'); 

Но я получаю ошибку

 Fatal error: Call to a member function getParam() on a non-object 

Мне нравится использовать их в методе __construct ();

В идеале я хотел бы проверить, не определено ли действие Action, он выполнит метод noaction (). Я бы проверял использование метода method_exists php.

Solutions Collecting From Web of "Как получить имя контроллера и действия в zf2"

Еще проще:

 $controllerName =$this->params('controller'); $actionName = $this->params('action'); 

вы не можете получить доступ к этим переменным в методе контроллера __construct() , но вы можете получить к ним доступ в методе dispatch методе onDispatch .

но если вы хотите проверить, существует ли действие или нет, в zf2 уже есть встроенная функция для notFoundAction, как показано ниже

  public function notFoundAction() { parent::notFoundAction(); $response = $this->getResponse(); $response->setStatusCode(200); $response->setContent("Action not found"); return $response; } 

но если вы все еще хотите сделать это вручную, вы можете сделать это с помощью методов отправки, как следует

 namespace Mynamespace\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\Stdlib\RequestInterface as Request; use Zend\Stdlib\ResponseInterface as Response; use Zend\Mvc\MvcEvent; class IndexController extends AbstractActionController { public function __construct() { } public function notFoundAction() { parent::notFoundAction(); $response = $this->getResponse(); $response->setStatusCode(200); $response->setContent("Action not found"); return $response; } public function dispatch(Request $request, Response $response = null) { /* * any customize code here */ return parent::dispatch($request, $response); } public function onDispatch(MvcEvent $e) { $action = $this->params('action'); //alertnatively //$routeMatch = $e->getRouteMatch(); //$action = $routeMatch->getParam('action', 'not-found'); if(!method_exists(__Class__, $action."Action")){ $this->noaction(); } return parent::onDispatch($e); } public function noaction() { echo 'action does not exits'; } } 

Вы получите модуль, контроллер и имя действия, подобное этому в Zf2 внутри вашего контроллера …

 $controllerClass = get_class($this); $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\')); $tmp = substr($controllerClass, strrpos($controllerClass, '\\')+1 ); $controllerName = str_replace('Controller', "", $tmp); //set 'variable' into layout... $this->layout()->currentModuleName = strtolower($moduleNamespace); $this->layout()->currentControllerName = strtolower($controllerName); $this->layout()->currentActionName = $this->params('action'); 
 $controllerName = strtolower(Zend_Controller_Front::getInstance()->getRequest()->getControllerName());