2012-09-01 59 views
5

我想知道爲什麼沒有人問過這個問題。zend:參數衝突

控制器類中的每個zend Action函數都有3個參數,分別是'module','controller'和'action'。

當我從一個表單或url獲得一個名爲'action'的參數時會發生什麼,例如「?action = edit」?

我測試了它:action從路由器保存它的值,而不是'編輯'。

public function someAction() { 
    $params = $this->getRequest()->getParams(); 
... 

我該如何傳遞名爲「action」的參數,如果我不得不?

在此先感謝。

回答

2

缺省路由是Zend_Controller_Router_Route_Module它使用的默認鍵模塊,控制器,&行動:

protected $_moduleKey  = 'module'; 
protected $_controllerKey = 'controller'; 
protected $_actionKey  = 'action'; 

// ... 

/** 
* Set request keys based on values in request object 
* 
* @return void 
*/ 
protected function _setRequestKeys() 
{ 
    if (null !== $this->_request) { 
     $this->_moduleKey  = $this->_request->getModuleKey(); 
     $this->_controllerKey = $this->_request->getControllerKey(); 
     $this->_actionKey  = $this->_request->getActionKey(); 
    } 

    if (null !== $this->_dispatcher) { 
     $this->_defaults += array(
      $this->_controllerKey => $this->_dispatcher->getDefaultControllerName(), 
      $this->_actionKey  => $this->_dispatcher->getDefaultAction(), 
      $this->_moduleKey  => $this->_dispatcher->getDefaultModule() 
     ); 
    } 

    $this->_keysSet = true; 
} 

/** 
* Matches a user submitted path. Assigns and returns an array of variables 
* on a successful match. 
* 
* If a request object is registered, it uses its setModuleName(), 
* setControllerName(), and setActionName() accessors to set those values. 
* Always returns the values as an array. 
* 
* @param string $path Path used to match against this routing map 
* @return array An array of assigned values or a false on a mismatch 
*/ 
public function match($path, $partial = false) 
{ 
    $this->_setRequestKeys(); 

    $values = array(); 
    $params = array(); 

    if (!$partial) { 
     $path = trim($path, self::URI_DELIMITER); 
    } else { 
     $matchedPath = $path; 
    } 

    if ($path != '') { 
     $path = explode(self::URI_DELIMITER, $path); 

     if ($this->_dispatcher && $this->_dispatcher->isValidModule($path[0])) { 
      $values[$this->_moduleKey] = array_shift($path); 
      $this->_moduleValid = true; 
     } 

     if (count($path) && !empty($path[0])) { 
      $values[$this->_controllerKey] = array_shift($path); 
     } 

     if (count($path) && !empty($path[0])) { 
      $values[$this->_actionKey] = array_shift($path); 
     } 

     if ($numSegs = count($path)) { 
      for ($i = 0; $i < $numSegs; $i = $i + 2) { 
       $key = urldecode($path[$i]); 
       $val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null; 
       $params[$key] = (isset($params[$key]) ? (array_merge((array) $params[$key], array($val))): $val); 
      } 
     } 
    } 

    if ($partial) { 
     $this->setMatchedPath($matchedPath); 
    } 

    $this->_values = $values + $params; 

    return $this->_values + $this->_defaults; 
} 

您可以看到默認的模塊路徑有MVC PARAMS默認鍵,但是,它將使用鍵如果它存在,則由請求對象設置,我們可以修改這些鍵。

例如在你的引導:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initRequestKeys() 
    { 
     $this->bootstrap('frontcontroller'); 
     $frontController = $this->getResource('frontcontroller'); 
     /* @var $frontController Zend_Controller_Front */ 

     $request = new Zend_Controller_Request_Http(); 

     // change action key 
     $request->setActionKey("new_action_key"); 

     // change module 
     $request->setModuleKey("new_module_key"); 

     // change controller 
     $request->setControllerKey("new_controller_key"); 


     // don't forget to set the configured request 
     // object to the front controller 
     $frontController->setRequest($request); 
    } 
} 

現在你可以使用模塊控制器,& 行動$_GET PARAMS。

1

經過一點測試,似乎你通過鑰匙「行動」事情。

如果您嘗試傳遞一個名爲「動作」$this->_request->getParams()的參數,您將獲得控制器動作值密鑰對。

如果從$form->getValues()形式傳遞「行動」鍵,你將會從命名「行動」表單元素的值。

與許多事情一樣,您的用例決定了您需要如何處理這種情況。

祝你好運。