Search code examples
phpzend-framework2

How to get controller and action name in zf2


in zf1, we can get controller and action name using

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

How we can achieve this in zf2?

UPDATE: I tried to get them using

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

But I am getting error

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

I like to get them in __construct() method;

Ideally I would like to check if there is no Action is defined it will execute noaction() method. I would check using php method method_exists.


Solution

  • you can't access these variables in controller __construct() method, but you can access them in dispatch method and onDispatch method.

    but if you would like to check whether action exist or not, in zf2 there is already a built in function for that notFoundAction as below

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

    but if you still like to do it manually you can do this using dispatch methods as follow

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