Вопрос по php, zend-framework2 – Как получить контроллер и имя действия в 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 ();
В идеале я хотел бы проверить, не определено ли действие, будет ли выполняться метод noaction (). Я бы проверил используя метод php method_exists.
Вы получите модуль, контроллер и имя действия, как это в 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 =$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';
}
}