2012-08-29 5 views
5

in ZF1 bekommen, können wir Controller und Aktionsnamen erhalten mitWie Controller und Aktionsnamen in ZF2

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

Wie wir dies in ZF2 erreichen können?

UPDATE: Ich habe versucht, sie zu erhalten, mit

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

Aber ich bin immer Fehler

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

Ich mag sie in __construct() -Methode zu erhalten;

Idealerweise würde ich gerne überprüfen, ob keine Aktion definiert ist, es wird noaction() Methode ausführen. Ich würde überprüfen, mit PHP-Methode method_exists.

Antwort

4

Sie diese Variablen in der Steuerung __construct() Methode nicht zugreifen können, aber man kann sich in dispatch Methode zugreifen und onDispatch Methode.

aber wenn Sie möchten, prüfen, ob Maßnahmen vorhanden sind oder nicht, in ZF2 gibt es bereits eine für die notFoundAction in Funktion gebaut, wie unten

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

aber wenn Sie immer noch, es zu tun manuell können Sie tun diese unter Verwendung von Versandverfahren als

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

Hallo, wenn ich Ihren Code auf meinem Controller einfügen, zeigt der Browser nichts (als Server sende keine Daten). Kannst du mir sagen, was passiert ist? Danke –

12

Noch einfacher:

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

es funktioniert nicht. selbe Fehler Schwerwiegender Fehler: Aufruf einer Member-Funktion getParam() für ein Nicht-Objekt. Mache ich etwas falsch?? Muss ich einen beliebigen Namensraum verwenden oder eine Klasse erweitern? Ich rufe dies in der __construct() Methode auf. – Developer

+0

Machst du diesen Anruf von einem Controller? Welche ZF2 Version verwendest du? –

+1

beta5, eigentlich denke ich, diese Variablen sind nicht zugänglich in __construct Methode des Controllers. kann aber in Dispatch- und onDispatch-Methoden zugreifbar sein. – Developer

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

Der Autor der Frage, die für zf2-Implementierung, nicht zf1 gefragt –

0

folgen Sie Modul, Controller und Aktionsnamen wie dies in Zf2 in Ihrem Controller erhalten ...

$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');