2012-08-29 30 views
5

trong zf1, chúng ta có thể có được điều khiển và tên hành động sử dụngLàm thế nào để có được điều khiển và tên hành động trong zf2

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

Làm thế nào chúng ta có thể đạt được điều này trong zf2?

UPDATE: tôi đã cố gắng để có được chúng sử dụng

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

Nhưng tôi nhận được lỗi

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

Tôi thích để có được chúng trong __construct() phương pháp;

Lý tưởng nhất là tôi muốn kiểm tra nếu không có Hành động nào được xác định, nó sẽ thực thi phương thức noaction(). Tôi sẽ kiểm tra bằng cách sử dụng phương thức php method_exists.

Trả lời

4

bạn không thể truy cập các biến trong phương pháp điều khiển __construct(), nhưng bạn có thể truy cập chúng ở dispatch phương pháp và phương pháp onDispatch.

nhưng nếu bạn muốn kiểm tra xem hành động tồn tại hay không, trong zf2 có đã tích hợp sẵn chức năng cho notFoundAction đó như sau

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

nhưng nếu bạn vẫn muốn làm điều đó bằng tay bạn có thể làm này sử dụng phương pháp công văn như sau

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

Xin chào, khi tôi chèn mã của bạn vào bộ điều khiển, trình duyệt sẽ không hiển thị gì (dưới dạng máy chủ không gửi dữ liệu). Bạn có thể cho tôi biết điều gì xảy ra không? Cảm ơn bạn –

12

Thậm chí đơn giản hơn:

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

nó không hoạt động. cùng lỗi Lỗi nghiêm trọng: Gọi hàm thành viên getParam() trên một đối tượng không phải. Tôi có làm điều gì sai?? Tôi có cần sử dụng bất kỳ không gian tên nào hoặc mở rộng bất kỳ lớp học nào không? Tôi gọi đây là phương thức __contruct(). – Developer

+0

Bạn có thực hiện cuộc gọi này từ Bộ điều khiển không? Bạn đang sử dụng phiên bản ZF2 nào? –

+1

beta5, thực sự tôi nghĩ rằng các biến này không thể truy cập được trong phương thức __construct của bộ điều khiển. nhưng có thể được chấp nhận trong các phương thức công văn và onDispatch. – Developer

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

Tác giả của câu hỏi được yêu cầu thực hiện zf2, chứ không phải zf1 –

0

bạn sẽ nhận được module, điều khiển và tên hành động như thế này trong Zf2 bên trong điều khiển của bạn ...

$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'); 
Các vấn đề liên quan