/** * @param FREST\Resource $resource * @return array * @throws FREST\Exception */ private function generateUpdateSpecs($resource) { $updateSpecs = array(); $updateSettings = $resource->getUpdateSettings(); /** @var Setting\Update $updateSetting */ foreach ($updateSettings as $updateSetting) { $alias = $updateSetting->getAlias(); if (isset($this->parameters[$alias])) { $value = $this->parameters[$alias]; $field = $resource->getFieldForAlias($alias); $fieldSetting = $resource->getFieldSettingForAlias($alias); $variableType = $fieldSetting->getVariableType(); // Type checking $castedValue = Type\Variable::castValue($value, $variableType); if (!isset($castedValue)) { $typeString = Type\Variable::getString($variableType); throw new FREST\Exception(FREST\Exception::InvalidType, "Expecting '{$alias}' to be of type '{$typeString}' but received '{$value}'"); } // Condition Func $conditionFunction = $updateSetting->getConditionFunction(); if (isset($conditionFunction)) { if (!method_exists($resource, $conditionFunction)) { throw new FREST\Exception(FREST\Exception::ConditionFunctionMissing, "Function name: '{$conditionFunction}', resource: '{$resource->getName()}'"); } $isValueValid = $resource->{$conditionFunction}($castedValue); if (!$isValueValid) { throw new FREST\Exception(FREST\Exception::InvalidFieldValue, "Field: '{$alias}'"); } } // Filter Func $filterFunction = $updateSetting->getFilterFunction(); if (isset($filterFunction)) { if (!method_exists($resource, $filterFunction)) { throw new FREST\Exception(FREST\Exception::FilterFunctionMissing, "Function name: '{$filterFunction}', resource: '{$resource->getName()}'"); } $castedValue = $resource->{$filterFunction}($castedValue); } $updateSpec = new Spec\Update($alias, $field, $castedValue, $variableType); $updateSpecs[$alias] = $updateSpec; } } return $updateSpecs; }