* (c) 2004-2006 Sean Kerr * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * sfRequest provides methods for manipulating client request information such * as attributes, and parameters. It is also possible to manipulate the * request method originally sent by the user. * * @package symfony * @subpackage request * @author Fabien Potencier * @author Sean Kerr * @version SVN: $Id: sfRequest.class.php 28641 2010-03-21 10:20:44Z fabien $ */ abstract class sfRequest implements ArrayAccess { const GET = 'GET'; const POST = 'POST'; const PUT = 'PUT'; const DELETE = 'DELETE'; const HEAD = 'HEAD'; protected $dispatcher = null, $content = null, $method = null, $options = array(), $parameterHolder = null, $attributeHolder = null; /** * Class constructor. * * @see initialize() */ public function __construct(sfEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array()) { $this->initialize($dispatcher, $parameters, $attributes, $options); } /** * Initializes this sfRequest. * * Available options: * * * logging: Whether to enable logging or not (false by default) * * @param sfEventDispatcher $dispatcher An sfEventDispatcher instance * @param array $parameters An associative array of initialization parameters * @param array $attributes An associative array of initialization attributes * @param array $options An associative array of options * * @return bool true, if initialization completes successfully, otherwise false * * @throws sfInitializationException If an error occurs while initializing this sfRequest */ public function initialize(sfEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array()) { $this->dispatcher = $dispatcher; $this->options = $options; if (!isset($this->options['logging'])) { $this->options['logging'] = false; } // initialize parameter and attribute holders $this->parameterHolder = new sfParameterHolder(); $this->attributeHolder = new sfParameterHolder(); $this->parameterHolder->add($parameters); $this->attributeHolder->add($attributes); } /** * Returns the options. * * @return array The options. */ public function getOptions() { return $this->options; } /** * Extracts parameter values from the request. * * @param array $names An indexed array of parameter names to extract * * @return array An associative array of parameters and their values. If * a specified parameter doesn't exist an empty string will * be returned for its value */ public function extractParameters($names) { $array = array(); $parameters = $this->parameterHolder->getAll(); foreach ($parameters as $key => $value) { if (in_array($key, $names)) { $array[$key] = $value; } } return $array; } /** * Gets the request method. * * @return string The request method */ public function getMethod() { return $this->method; } /** * Sets the request method. * * @param string $method The request method * * @throws sfException - If the specified request method is invalid */ public function setMethod($method) { if (!in_array(strtoupper($method), array(self::GET, self::POST, self::PUT, self::DELETE, self::HEAD))) { throw new sfException(sprintf('Invalid request method: %s.', $method)); } $this->method = strtoupper($method); } /** * Returns true if the request parameter exists (implements the ArrayAccess interface). * * @param string $name The name of the request parameter * * @return Boolean true if the request parameter exists, false otherwise */ public function offsetExists($name) { return $this->hasParameter($name); } /** * Returns the request parameter associated with the name (implements the ArrayAccess interface). * * @param string $name The offset of the value to get * * @return mixed The request parameter if exists, null otherwise */ public function offsetGet($name) { return $this->getParameter($name, false); } /** * Sets the request parameter associated with the offset (implements the ArrayAccess interface). * * @param string $offset The parameter name * @param string $value The parameter value */ public function offsetSet($offset, $value) { $this->setParameter($offset, $value); } /** * Removes a request parameter. * * @param string $offset The parameter name */ public function offsetUnset($offset) { $this->getParameterHolder()->remove($offset); } /** * Retrieves the parameters for the current request. * * @return sfParameterHolder The parameter holder */ public function getParameterHolder() { return $this->parameterHolder; } /** * Retrieves the attributes holder. * * @return sfParameterHolder The attribute holder */ public function getAttributeHolder() { return $this->attributeHolder; } /** * Retrieves an attribute from the current request. * * @param string $name Attribute name * @param string $default Default attribute value * * @return mixed An attribute value */ public function getAttribute($name, $default = null) { return $this->attributeHolder->get($name, $default); } /** * Indicates whether or not an attribute exist for the current request. * * @param string $name Attribute name * * @return bool true, if the attribute exists otherwise false */ public function hasAttribute($name) { return $this->attributeHolder->has($name); } /** * Sets an attribute for the request. * * @param string $name Attribute name * @param string $value Value for the attribute * */ public function setAttribute($name, $value) { $this->attributeHolder->set($name, $value); } /** * Retrieves a parameter for the current request. * * @param string $name Parameter name * @param string $default Parameter default value * */ public function getParameter($name, $default = null) { return $this->parameterHolder->get($name, $default); } /** * Indicates whether or not a parameter exist for the current request. * * @param string $name Parameter name * * @return bool true, if the parameter exists otherwise false */ public function hasParameter($name) { return $this->parameterHolder->has($name); } /** * Sets a parameter for the current request. * * @param string $name Parameter name * @param string $value Parameter value * */ public function setParameter($name, $value) { $this->parameterHolder->set($name, $value); } /** * Returns the content of the current request. * * @return string|Boolean The content or false if none is available */ public function getContent() { if (null === $this->content) { if (0 === strlen(trim($this->content = file_get_contents('php://input')))) { $this->content = false; } } return $this->content; } /** * Calls methods defined via sfEventDispatcher. * * @param string $method The method name * @param array $arguments The method arguments * * @return mixed The returned value of the called method * * @throws sfException if call fails */ public function __call($method, $arguments) { $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'request.method_not_found', array('method' => $method, 'arguments' => $arguments))); if (!$event->isProcessed()) { throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method)); } return $event->getReturnValue(); } public function __clone() { $this->parameterHolder = clone $this->parameterHolder; $this->attributeHolder = clone $this->attributeHolder; } }