Пример #1
0
 /**
  * @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;
     }
 }
Пример #2
0
 /**
  * @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;
 }