php 如何在 zf2 中获取控制器和动作名称

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12179840/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 02:59:44  来源:igfitidea点击:

How to get controller and action name in zf2

phpzend-framework2

提问by Developer

in zf1, we can get controller and action name using

在 zf1 中,我们可以使用

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

How we can achieve this in zf2?

我们如何在 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;

我喜欢在 __construct() 方法中获取它们;

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.

理想情况下,我想检查是否没有定义 Action 它将执行 noaction() 方法。我会检查使用 php 方法 method_exists。

采纳答案by Developer

you can't access these variables in controller __construct()method, but you can access them in dispatchmethod and onDispatchmethod.

你不能在控制器__construct()方法中访问这些变量,但你可以在dispatch方法和onDispatch方法中访问它们。

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

但是如果你想检查动作是否存在,在 zf2 中已经有一个内置函数用于 notFoundAction 如下

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

回答by Al-Punk

Even simpler:

更简单:

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

回答by Purvesh

You will get module , controller and action name like this in Zf2 inside your controller...

您将在控制器内的 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');

回答by Piter

$controllerName = strtolower(Zend_Controller_Front::getInstance()->getRequest()->getControllerName());