2012-09-01 13 views
5

Me pregunto por qué nadie ha hecho esta pregunta.zend: colisión de parámetros

Cada función Zend Action en la clase de controlador tiene 3 parámetros, a saber, 'módulo', 'controlador' y 'acción'.

¿Qué sucede cuando obtengo un parámetro llamado 'acción' de un formulario o url, por ejemplo "? Action = edit" ??

Lo probé: la acción tiene su valor desde el enrutador, no 'editar'.

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

¿Cómo podría pasar el parámetro llamado "acción", si tuviera que hacerlo?

Gracias de antemano.

Respuesta

2

La ruta por defecto es Zend_Controller_Router_Route_Module que utiliza claves por defecto para el módulo, controlador, & acción:

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; 
} 

se puede ver que la ruta módulo por defecto tiene teclas predeterminadas para params mvc, sin embargo, utilizará las teclas establecido por el objeto de solicitud si existe y podemos modificar estas claves.

p. Ej. en su archivo de arranque:

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); 
    } 
} 

Ahora puede utilizar el módulo , controlador, & acción como $_GET params.

1

Después de un poco de prueba, parece que cómo se pasa la clave "acción" asuntos.

Si intenta pasar un parámetro llamado "acción" con $this->_request->getParams() obtendrá el par de claves del valor de acción del controlador.

Si pasa el clave de "acción" de un formulario con $form->getValues() va a recuperar el valor del elemento de formulario denominado "acción".

Como con tantas cosas, su caso de uso determina cómo debe manejar la situación.

Buena suerte.

Cuestiones relacionadas