_apiUser = $user; } public function setBaseUri($uri) { $this->_apiBaseUri = $uri; } public function execute($url) { $request = $this->parseUrl($url); $apiRouterName = $request->apiRouterName; IF(V::get('DBG','',$_GET)){echo'
apiRouterName (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($apiRouterName);echo'
';} $apiRouterName = ucfirst(strtolower($apiRouterName)); $apiRouterClassName = "Api_{$apiRouterName}"; if (!Lib::tryLoadClass($apiRouterClassName)) { throw new HttpException("Route not exists", 404); } $apiRouter = new $apiRouterClassName(); $apiRouter->setUser($this->_apiUser); $apiRouter->setBaseUri($this->_apiBaseUri); $responseDocument = $apiRouter->execute($request); if (empty($responseDocument)) { throw new HttpException("No result", 404); } $this->response($responseDocument); } private function parseUrl($url) { $request = new stdClass(); $request->url = trim($url, '/ '); $urlParts = explode('?', $request->url); $request->path = $urlParts[0]; $request->query = (count($urlParts) > 1)? $urlParts[1] : ''; $request->args = $_REQUEST; $request->segments = array(); $urlPathParts = explode('/', $request->path); foreach ($urlPathParts as $part) { if (!empty($part)) $request->segments[] = $part; } IF(V::get('DBG','',$_GET)>1){echo'
url (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($request);echo'
';} $request->format = array_shift($request->segments); if (empty($request->segments)) return null; IF(V::get('DBG','',$_GET)>1){echo'
responseFormat (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($request->format);echo'
';} if (!$this->checkResponseFormat($request->format)) { throw new HttpException("Response format not allowed", 400); } IF(V::get('DBG','',$_GET)>1){echo'
u (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($request);echo'
';} $request->apiRouterName = array_shift($request->segments); IF(V::get('DBG','',$_GET)>1){echo'
u (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($request);echo'
';} if (!empty($request->query)) { $queryArgs = array(); parse_str($request->query, $queryArgs); $request->query = $queryArgs; } $this->_request = $request; return $this->_request; } private function checkResponseFormat($format) { $allowedTypes = array(); $allowedTypes[] = 'xml'; $allowedTypes[] = 'json'; $allowedTypes[] = 'csv'; $allowedTypes[] = 'csv_file'; $allowedTypes[] = 'raw'; //$allowedTypes[] = 'xml-ns';// xml with namespace return in_array($format, $allowedTypes); } private function response($document) { if ('xml' == $this->_request->format) { $this->responseXml($document); } else if ('json' == $this->_request->format) { $this->responseJson($document); } else if ('csv' == $this->_request->format) { $this->responseCsv($document); } else if ('csv_file' == $this->_request->format) { $this->responseCsvFile($document); } else if ('raw' == $this->_request->format) { echo $document; } } private function responseXml($document) { IF(V::get('DBG','',$_GET)){echo'
document (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($document);echo'
';} $xml = new DOMDocument('1.0', 'utf-8'); $xml->formatOutput = true; $data = $xml->createElement('data'); $xml->appendChild($data); $this->_xmlAddChildRec($document, $data, $xml); header('Content-type: application/xml; charset="utf-8"'); echo $xml->saveXML(); } private function _xmlAddChildRec($node, $parentNode, $dom) { if (!$node) return; if (is_object($node)) { foreach ($node as $childNodeName => $childNode) { $n = $dom->createElement($childNodeName); $parentNode->appendChild($n); $this->_xmlAddChildRec($childNode, $n, $dom); } } else if (is_array($node)) { foreach ($node as $childNodeIndeks => $childNode) { $this->_xmlAddChildRec($childNode, $parentNode, $dom); } } else if (false !== strpos($node, '&')) { $n = $dom->createCDATASection($node); $parentNode->appendChild($n); } else { $n = $dom->createTextNode($node); $parentNode->appendChild($n); } } private function responseJson($document) { IF(V::get('DBG','',$_GET)){echo'
document (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($document);echo'
';} header('Content-type: application/json; charset="utf-8"'); echo json_encode($document); } private function responseCsv($document) { header('Content-Type: text/csv; charset=utf-8'); if (empty($document)) return; $csvSeparator = ';'; $this->_printCsvDocument($document, $csvSeparator); } private function responseCsvFile($document) { $csvFileName = 'output';//$this->_request if ('table' === $this->_request->apiRouterName) { $pathEx = explode('/', $this->_request->path); if (count($pathEx) > 3) { $csvFileName = $pathEx[3]; } } header('Content-Type: text/csv; charset=utf-8'); header("Content-Disposition: attachment; filename={$csvFileName}.csv"); if (empty($document)) return; $csvSeparator = ';'; $this->_printCsvDocument($document, $csvSeparator); } private function _printCsvDocument($document, $csvSeparator = ';') { if (empty($document)) return; $fldList = array(); $labelsLine = array(); foreach ($document->items[0]->item as $fldName => $value) { $fldList[] = $fldName; $labelsLine[] = '"' . addslashes($fldName) . '"'; } echo implode($csvSeparator, $labelsLine) . "\n"; foreach ($document->items as $itemsList) { foreach ($itemsList as $item) { $itemLine = array(); foreach ($fldList as $fldName) { $itemLine[] = '"' . addslashes($item->{$fldName}) . '"'; } echo implode($csvSeparator, $itemLine) . "\n"; } } } }