2012-09-01 22 views
5

मुझे आश्चर्य है कि किसी ने कभी भी इस सवाल से क्यों नहीं पूछा।ज़ेंड: पैरामीटर टक्कर

नियंत्रक वर्ग में प्रत्येक ज़ेंड एक्शन फ़ंक्शन में 3 पैरामीटर होते हैं, अर्थात् 'मॉड्यूल', 'नियंत्रक' और 'एक्शन'।

क्या होता है, जब मुझे किसी फॉर्म या यूआरएल से 'एक्शन' नामक पैरामीटर मिलता है, उदाहरण के लिए "? 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 पैरामीटर के लिए डिफ़ॉल्ट कुंजी है, तथापि, यह कुंजी का उपयोग करेगा यदि अनुरोध मौजूद है तो अनुरोध ऑब्जेक्ट द्वारा सेट करें और हम इन कुंजी को संशोधित कर सकते हैं।

उदा अपने बूटस्ट्रैप में:

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 के रूप में पैरामीटर का उपयोग कर सकते हैं।

1

थोड़ा परीक्षण करने के बाद ऐसा लगता है कि आप कुंजी "कार्रवाई" मामलों को कैसे पास करते हैं।

यदि आप नामक पैरामीटर को आजमाते हैं और$this->_request->getParams() के साथ आपको नियंत्रक क्रिया मान कुंजी जोड़ी मिल जाएगी।

आप $form->getValues() के साथ एक फार्म से "कार्रवाई" कुंजी पार कर लेते हैं आप "कार्रवाई" नामित प्रपत्र तत्व से मान प्राप्त होगा।

इतनी सारी चीजों के साथ, आपका उपयोग केस निर्धारित करता है कि आपको स्थिति को संभालने की आवश्यकता है।

गुड लक।