*/ class Request extends Param { public const HEAD = 'HEAD'; public const POST = 'POST'; public const PUT = 'PUT'; public const GET = 'GET'; public const DELETE = 'DELETE'; public const DEFAULT_CONTENT_TYPE = 'application/json'; public const NDJSON_CONTENT_TYPE = 'application/x-ndjson'; /** * @var Connection|null */ protected $_connection; /** * Construct. * * @param string $path Request path * @param string $method OPTIONAL Request method (use const's) (default = self::GET) * @param array|string $data OPTIONAL Data array * @param array $query OPTIONAL Query params * @param string $contentType Content-Type sent with this request */ public function __construct(string $path, string $method = self::GET, $data = [], array $query = [], ?Connection $connection = null, string $contentType = self::DEFAULT_CONTENT_TYPE) { $this->setPath($path); $this->setMethod($method); $this->setData($data); $this->setQuery($query); if ($connection) { $this->setConnection($connection); } $this->setContentType($contentType); } public function __toString(): string { return JSON::stringify($this->toArray()); } /** * Sets the request method. Use one of the for consts. * * @return $this */ public function setMethod(string $method) { return $this->setParam('method', $method); } /** * Get request method. */ public function getMethod(): string { return $this->getParam('method'); } /** * Sets the request data. * * @param array|string $data Request data * * @return $this */ public function setData($data) { return $this->setParam('data', $data); } /** * Return request data. * * @return array|string Request data */ public function getData() { return $this->getParam('data'); } /** * Sets the request path. * * @return $this */ public function setPath(string $path) { return $this->setParam('path', $path); } /** * Return request path. */ public function getPath(): string { return $this->getParam('path'); } /** * Return query params. * * @return array Query params */ public function getQuery(): array { return $this->getParam('query'); } /** * @return $this */ public function setQuery(array $query = []) { return $this->setParam('query', $query); } /** * @return $this */ public function setConnection(Connection $connection) { $this->_connection = $connection; return $this; } /** * Return Connection Object. * * @throws Exception\InvalidException If no valid connection was set */ public function getConnection(): Connection { if (null === $this->_connection) { throw new InvalidException('No valid connection object set'); } return $this->_connection; } /** * Set the Content-Type of this request. */ public function setContentType(string $contentType) { return $this->setParam('contentType', $contentType); } /** * Get the Content-Type of this request. */ public function getContentType(): string { return $this->getParam('contentType'); } /** * Sends request to server. * * @throws ResponseException * @throws ConnectionException */ public function send(): Response { $transport = $this->getConnection()->getTransportObject(); // Refactor: Not full toArray needed in exec? return $transport->exec($this, $this->getConnection()->toArray()); } /** * @return array */ public function toArray() { $data = $this->getParams(); if ($this->_connection) { $data['connection'] = $this->_connection->getParams(); } return $data; } /** * Converts request to curl request format. * * @deprecated since version 7.1.3, use the "__toString()" method or cast to string instead. * * @return string */ public function toString() { \trigger_deprecation('ruflin/elastica', '7.1.3', 'The "%s()" method is deprecated, use "__toString()" or cast to string instead. It will be removed in 8.0.', __METHOD__); return (string) $this; } }