2012-08-29 21 views
5

en ZF1, podemos conseguir controlador y nombre de la acción utilizandoCómo llegar controlador y nombre de la acción en ZF2

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

¿Cómo podemos lograr esto en ZF2?

ACTUALIZACIÓN: Me trataron de conseguir que el uso de

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

pero estoy consiguiendo error

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

me gusta llegar en __construct() método;

Idealmente me gustaría comprobar si no hay Acción definida, se ejecutará el método noaction(). Verificaría usando el método php method_exists.

Respuesta

4

no puede acceder a estas variables en el método controlador __construct(), pero se puede acceder a ellos en dispatch método y onDispatch método.

pero si quisiera comprobar si la acción existe o no, en ZF2 ya hay una función integrada para que notFoundAction como a continuación

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

pero si aún desea hacerlo de forma manual que puede hacer mediante métodos de despacho de la siguiente manera

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

Hola, cuando inserto el código a mi controlador, el navegador no muestran nada (como el servidor no enviar datos). ¿Podrías decirme qué sucede? Gracias –

12

aún más simple:

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

no funciona. mismo error Error fatal: llamada a una función miembro getParam() en un no objeto. ¿¿Estoy haciendo algo mal?? ¿Debo usar cualquier espacio de nombre o extender cualquier clase? Estoy llamando esto en el método __contruct(). – Developer

+0

¿Estás haciendo esta llamada desde un controlador? ¿Qué versión de ZF2 estás usando? –

+1

beta5, de hecho, creo que estas variables no son accesibles en el método __construct del controlador. pero puede ser ejecutable en los métodos de despacho y en Despacho. – Developer

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

El autor de la pregunta solicitada para la implementación zf2, no zf1 –

0

Usted recibirá módulo, controlador y nombre de la acción de este tipo en el interior de su controlador 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'); 
Cuestiones relacionadas