2012-09-01 18 views
5

誰もこの質問を聞いたことがないのだろうかと思います。zend:パラメータの衝突

コントローラークラスのすべてのzendアクション関数には、3つのパラメーター、つまり 'module'、 'controller'、および 'action'があります。

フォームやURLから「action」という名前のパラメータを取得すると、「?action = edit」などのようになります。

私はそれを試しました:アクションは、ルータから値を保持し、「編集」しません。

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

「アクション」という名前のパラメータを渡すにはどうすればよいですか?

ありがとうございます。

答えて

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()とフォームから「アクション」キーを渡す場合は、「アクション」という名前のフォーム要素から値を取得します。

多くの場合と同様に、ユースケースによって状況をどのように処理する必要があるかが決まります。

Good Luck。