Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 382
Developer Avatar asked Aug 29 '12 14:08

Developer


2 Answers

Even simpler:

$controllerName =$this->params('controller');
$actionName = $this->params('action');
like image 188
Al-Punk Avatar answered Oct 11 '22 13:10

Al-Punk


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';   
    }
}   
like image 40
Developer Avatar answered Oct 11 '22 13:10

Developer