Matthew Weier O’Phinney shares a bit of very useful code to inject request params into a Zend Framework request object from a JSON or XML POST request.
“Below is a plugin I use to translate JSON or XML raw post request data to request user parameters.
Note that it expects a “Content-Type” header of either “application/json” or “application/xml”. If those are detected, it then does the translation and injection.
Once it has, you can then simply access the parameters from your request object like any others.
I actually use this with dojox.data.JsonRestStore already, so you should be set. :)”
class App_Controller_Helper_Params extends Zend_Controller_Action_Helper_Abstract {
/**
* @var array Parameters detected in raw content body
*/
protected $_bodyParams = array();
/**
* Do detection of content type, and retrieve parameters from raw body if
* present
*
* @return void
*/
public function init() {
$request = $this->getRequest();
$contentType = $request->getHeader('Content-Type');
$rawBody = $request->getRawBody();
if (!$rawBody) {
return;
}
switch (true) {
case (strstr($contentType, 'application/json')):
$this->setBodyParams(Zend_Json::decode($rawBody));
break;
case (strstr($contentType, 'application/xml')):
$config = new Zend_Config_Xml($rawBody);
$this->setBodyParams($config->toArray());
break;
default:
if ($request->isPut()) {
parse_str($rawBody, $params);
$this->setBodyParams($params);
}
break;
}
}
/**
* Set body params
*
* @param array $params
* @return Scrummer_Controller_Action
*/
public function setBodyParams(array $params)
{
$this->_bodyParams = $params;
return $this;
}
/**
* Retrieve body parameters
*
* @return array
*/
public function getBodyParams()
{
return $this->_bodyParams;
}
/**
* Get body parameter
*
* @param string $name
* @return mixed
*/
public function getBodyParam($name)
{
if ($this->hasBodyParam($name)) {
return $this->_bodyParams[$name];
}
return null;
}
/**
* Is the given body parameter set?
*
* @param string $name
* @return bool
*/
public function hasBodyParam($name)
{
if (isset($this->_bodyParams[$name])) {
return true;
}
return false;
}
/**
* Do we have any body parameters?
*
* @return bool
*/
public function hasBodyParams()
{
if (!empty($this->_bodyParams)) {
return true;
}
return false;
}
/**
* Get submit parameters
*
* @return array
*/
public function getSubmitParams()
{
if ($this->hasBodyParams()) {
return $this->getBodyParams();
}
return $this->getRequest()->getPost();
}
public function direct()
{
return $this->getSubmitParams();
}
}
