/** * @param FREST\Router $frest * @param int $format * @param bool $inline * * @return string */ public function output($frest, $format = Type\OutputFormat::JSON, $inline = FALSE) { $this->outputObject = $this->generateOutputObject(); if ($frest->getConfig()->getShowDiagnostics()) { $this->outputObject->diagnostics = new \stdClass(); $this->outputObject->diagnostics->timing = $frest->getTimingObject(); $this->outputObject->diagnostics->memory = number_format(memory_get_peak_usage(TRUE) / 1000 / 1000, 3) . 'mb'; } switch ($format) { case Type\OutputFormat::JSON: $output = json_encode($this->outputObject); break; case Type\OutputFormat::JSONP: $output = 'callback(' . json_encode($this->outputObject) . ')'; break; case Type\OutputFormat::XML: $output = '<root>not yet implemented</root>'; break; case Type\OutputFormat::_ARRAY: $output = get_object_vars($this->outputObject); $inline = TRUE; break; case Type\OutputFormat::OBJECT: $output = $this->outputObject; $inline = TRUE; break; default: $output = 'invalid output format'; break; } if ($inline) { return $output; } else { $headerStatusCode = $frest->getSuppressHTTPStatusCodes() ? 200 : $this->httpStatusCode; header('HTTP/1.1: ' . $headerStatusCode); header('Status: ' . $headerStatusCode); header('Content-Type: ' . Type\OutputFormat::contentTypeString($format)); if (extension_loaded('zlib') && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) { //ob_end_clean(); //ob_start('ob_gzhandler'); } else { if ($output) { header('Content-Length: ' . strlen($output)); } } if (is_string($output)) { echo $output; } else { var_dump($output); } return NULL; } }
/** * @throws FREST\Exception */ protected function setupResourceFunction() { $resourceFunctions = $this->resource->getResourceFunctions(); // check if valid Func name if (!isset($resourceFunctions) || !isset($resourceFunctions[$this->resourceFunctionName])) { throw new FREST\Exception(FREST\Exception::ResourceFunctionDoesntExist, "Function name: '{$this->resourceFunctionName}'"); } /** @var Func\Resource $resourceFunction */ $resourceFunction = $resourceFunctions[$this->resourceFunctionName]; $resourceFunctionParameters = $resourceFunction->getParameters(); // check method $requiredMethod = $resourceFunction->getMethod(); $currentMethod = $this->frest->getMethod(); if ($requiredMethod != $currentMethod) { $currentMethodString = Type\Method::getString($currentMethod); $requiredMethodString = Type\Method::getString($requiredMethod); throw new FREST\Exception(FREST\Exception::MismatchingResourceFunctionMethod, "Requires '{$requiredMethodString}' but using '{$currentMethodString}'"); } // check for invalid parameters and build parameter list for Func $functionParameters = array(); foreach ($this->parameters as $parameterName => $value) { $isValidMiscParam = isset($this->miscParameters[$parameterName]); if (!$isValidMiscParam) { if (!isset($resourceFunctionParameters[$parameterName])) { throw new FREST\Exception(FREST\Exception::InvalidFunctionParameter, "Parameter name: '{$parameterName}'"); } $functionParameters[$parameterName] = $value; } } if (isset($resourceFunctionParameters) && count($resourceFunctionParameters) > 0) { // check for all required parameters /** @var Func\FunctionParam $parameter */ $missingParameterNames = array(); foreach ($resourceFunctionParameters as $parameterName => $parameter) { // check type if (isset($functionParameters[$parameterName])) { $variableType = $parameter->getVariableType(); $value = $functionParameters[$parameterName]; $castedValue = Type\Variable::castValue($value, $variableType); if (!isset($castedValue)) { $typeString = Type\Variable::getString($variableType); throw new FREST\Exception(FREST\Exception::InvalidType, "Expecting parameter '{$parameterName}' to be of type '{$typeString}' but received '{$value}'"); } $functionParameters[$parameterName] = $castedValue; } else { if ($parameter->getRequired()) { $missingParameterNames[] = $parameterName; } } } if (count($missingParameterNames) > 0) { $missingString = implode(', ', $missingParameterNames); throw new FREST\Exception(FREST\Exception::MissingRequiredFunctionParameter, "Parameter name: '{$missingString}'"); } } // Check for Func implementation existence if (!method_exists($this->resource, $this->resourceFunctionName)) { throw new FREST\Exception(FREST\Exception::ResourceFunctionMissing, "Function name: '{$this->resourceFunctionName}', resource: '{$this->resource->getName()}'"); } if ($resourceFunction->getRequiresResourceID()) { $functionParameters['resourceID'] = $this->resourceID; } $this->resourceFunction = $resourceFunction; $this->resourceFunctionParameters = $functionParameters; }