в 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.
Еще проще:
$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());