getModel($data['$ref'])) { // The name of the original parameter should override the ref name if one is available $name = empty($data['name']) ? null : $data['name']; $data = $model->toArray(); if ($name) { $data['name'] = $name; } } } elseif (isset($data['extends'])) { // If this parameter extends from another parameter then start with the actual data // union in the parent's data (e.g. actual supersedes parent) if ($extends = $description->getModel($data['extends'])) { $data += $extends->toArray(); } } } // Pull configuration data into the parameter foreach ($data as $key => $value) { $this->{$key} = $value; } $this->serviceDescription = $description; $this->required = (bool) $this->required; $this->data = (array) $this->data; if ($this->filters) { $this->setFilters((array) $this->filters); } if ($this->type == 'object' && $this->additionalProperties === null) { $this->additionalProperties = true; } } /** * Convert the object to an array * * @return array */ public function toArray() { static $checks = array('required', 'description', 'static', 'type', 'format', 'instanceOf', 'location', 'sentAs', 'pattern', 'minimum', 'maximum', 'minItems', 'maxItems', 'minLength', 'maxLength', 'data', 'enum', 'filters'); $result = array(); // Anything that is in the `Items` attribute of an array *must* include it's name if available if ($this->parent instanceof self && $this->parent->getType() == 'array' && isset($this->name)) { $result['name'] = $this->name; } foreach ($checks as $c) { if ($value = $this->{$c}) { $result[$c] = $value; } } if ($this->default !== null) { $result['default'] = $this->default; } if ($this->items !== null) { $result['items'] = $this->getItems()->toArray(); } if ($this->additionalProperties !== null) { $result['additionalProperties'] = $this->getAdditionalProperties(); if ($result['additionalProperties'] instanceof self) { $result['additionalProperties'] = $result['additionalProperties']->toArray(); } } if ($this->type == 'object' && $this->properties) { $result['properties'] = array(); foreach ($this->getProperties() as $name => $property) { $result['properties'][$name] = $property->toArray(); } } return $result; } /** * Get the default or static value of the command based on a value * * @param string $value Value that is currently set * * @return mixed Returns the value, a static value if one is present, or a default value */ public function getValue($value) { return $this->static || ($this->default !== null && !$value && ($this->type != 'boolean' || $value !== false)) ? $this->default : $value; } /** * Run a value through the filters OR format attribute associated with the parameter * * @param mixed $value Value to filter * * @return mixed Returns the filtered value */ public function filter($value) { // Formats are applied exclusively and supersed filters if ($this->format) { return SchemaFormatter::format($this->format, $value); } // Convert Boolean values if ($this->type == 'boolean' && !is_bool($value)) { $value = filter_var($value, FILTER_VALIDATE_BOOLEAN); } // Apply filters to the value if ($this->filters) { foreach ($this->filters as $filter) { if (is_array($filter)) { // Convert complex filters that hold value place holders foreach ($filter['args'] as &$data) { if ($data == '@value') { $data = $value; } elseif ($data == '@api') { $data = $this; } } $value = call_user_func_array($filter['method'], $filter['args']); } else { $value = call_user_func($filter, $value); } } } return $value; } /** * Get the name of the parameter * * @return string */ public function getName() { return $this->name; } /** * Get the key of the parameter, where sentAs will supersede name if it is set * * @return string */ public function getWireName() { return $this->sentAs ?: $this->name; } /** * Set the name of the parameter * * @param string $name Name to set * * @return self */ public function setName($name) { $this->name = $name; return $this; } /** * Get the type(s) of the parameter * * @return string|array */ public function getType() { return $this->type; } /** * Set the type(s) of the parameter * * @param string|array $type Type of parameter or array of simple types used in a union * * @return self */ public function setType($type) { $this->type = $type; return $this; } /** * Get if the parameter is required * * @return bool */ public function getRequired() { return $this->required; } /** * Set if the parameter is required * * @param bool $isRequired Whether or not the parameter is required * * @return self */ public function setRequired($isRequired) { $this->required = (bool) $isRequired; return $this; } /** * Get the default value of the parameter * * @return string|null */ public function getDefault() { return $this->default; } /** * Set the default value of the parameter * * @param string|null $default Default value to set * * @return self */ public function setDefault($default) { $this->default = $default; return $this; } /** * Get the description of the parameter * * @return string|null */ public function getDescription() { return $this->description; } /** * Set the description of the parameter * * @param string $description Description * * @return self */ public function setDescription($description) { $this->description = $description; return $this; } /** * Get the minimum acceptable value for an integer * * @return int|null */ public function getMinimum() { return $this->minimum; } /** * Set the minimum acceptable value for an integer * * @param int|null $min Minimum * * @return self */ public function setMinimum($min) { $this->minimum = $min; return $this; } /** * Get the maximum acceptable value for an integer * * @return int|null */ public function getMaximum() { return $this->maximum; } /** * Set the maximum acceptable value for an integer * * @param int $max Maximum * * @return self */ public function setMaximum($max) { $this->maximum = $max; return $this; } /** * Get the minimum allowed length of a string value * * @return int */ public function getMinLength() { return $this->minLength; } /** * Set the minimum allowed length of a string value * * @param int|null $min Minimum * * @return self */ public function setMinLength($min) { $this->minLength = $min; return $this; } /** * Get the maximum allowed length of a string value * * @return int|null */ public function getMaxLength() { return $this->maxLength; } /** * Set the maximum allowed length of a string value * * @param int $max Maximum length * * @return self */ public function setMaxLength($max) { $this->maxLength = $max; return $this; } /** * Get the maximum allowed number of items in an array value * * @return int|null */ public function getMaxItems() { return $this->maxItems; } /** * Set the maximum allowed number of items in an array value * * @param int $max Maximum * * @return self */ public function setMaxItems($max) { $this->maxItems = $max; return $this; } /** * Get the minimum allowed number of items in an array value * * @return int */ public function getMinItems() { return $this->minItems; } /** * Set the minimum allowed number of items in an array value * * @param int|null $min Minimum * * @return self */ public function setMinItems($min) { $this->minItems = $min; return $this; } /** * Get the location of the parameter * * @return string|null */ public function getLocation() { return $this->location; } /** * Set the location of the parameter * * @param string|null $location Location of the parameter * * @return self */ public function setLocation($location) { $this->location = $location; return $this; } /** * Get the sentAs attribute of the parameter that used with locations to sentAs an attribute when it is being * applied to a location. * * @return string|null */ public function getSentAs() { return $this->sentAs; } /** * Set the sentAs attribute * * @param string|null $name Name of the value as it is sent over the wire * * @return self */ public function setSentAs($name) { $this->sentAs = $name; return $this; } /** * Retrieve a known property from the parameter by name or a data property by name. When not specific name value * is specified, all data properties will be returned. * * @param string|null $name Specify a particular property name to retrieve * * @return array|mixed|null */ public function getData($name = null) { if (!$name) { return $this->data; } if (isset($this->data[$name])) { return $this->data[$name]; } elseif (isset($this->{$name})) { return $this->{$name}; } return null; } /** * Set the extra data properties of the parameter or set a specific extra property * * @param string|array|null $nameOrData The name of a specific extra to set or an array of extras to set * @param mixed|null $data When setting a specific extra property, specify the data to set for it * * @return self */ public function setData($nameOrData, $data = null) { if (is_array($nameOrData)) { $this->data = $nameOrData; } else { $this->data[$nameOrData] = $data; } return $this; } /** * Get whether or not the default value can be changed * * @return mixed|null */ public function getStatic() { return $this->static; } /** * Set to true if the default value cannot be changed * * @param bool $static True or false * * @return self */ public function setStatic($static) { $this->static = (bool) $static; return $this; } /** * Get an array of filters used by the parameter * * @return array */ public function getFilters() { return $this->filters ?: array(); } /** * Set the array of filters used by the parameter * * @param array $filters Array of functions to use as filters * * @return self */ public function setFilters(array $filters) { $this->filters = array(); foreach ($filters as $filter) { $this->addFilter($filter); } return $this; } /** * Add a filter to the parameter * * @param string|array $filter Method to filter the value through * * @return self * @throws InvalidArgumentException */ public function addFilter($filter) { if (is_array($filter)) { if (!isset($filter['method'])) { throw new InvalidArgumentException('A [method] value must be specified for each complex filter'); } } if (!$this->filters) { $this->filters = array($filter); } else { $this->filters[] = $filter; } return $this; } /** * Get the parent object (an {@see OperationInterface} or {@see Parameter} * * @return OperationInterface|Parameter|null */ public function getParent() { return $this->parent; } /** * Set the parent object of the parameter * * @param OperationInterface|Parameter|null $parent Parent container of the parameter * * @return self */ public function setParent($parent) { $this->parent = $parent; return $this; } /** * Get the properties of the parameter * * @return array */ public function getProperties() { if (!$this->propertiesCache) { $this->propertiesCache = array(); foreach (array_keys($this->properties) as $name) { $this->propertiesCache[$name] = $this->getProperty($name); } } return $this->propertiesCache; } /** * Get a specific property from the parameter * * @param string $name Name of the property to retrieve * * @return null|Parameter */ public function getProperty($name) { if (!isset($this->properties[$name])) { return null; } if (!($this->properties[$name] instanceof self)) { $this->properties[$name]['name'] = $name; $this->properties[$name] = new static($this->properties[$name], $this->serviceDescription); $this->properties[$name]->setParent($this); } return $this->properties[$name]; } /** * Remove a property from the parameter * * @param string $name Name of the property to remove * * @return self */ public function removeProperty($name) { unset($this->properties[$name]); $this->propertiesCache = null; return $this; } /** * Add a property to the parameter * * @param Parameter $property Properties to set * * @return self */ public function addProperty(Parameter $property) { $this->properties[$property->getName()] = $property; $property->setParent($this); $this->propertiesCache = null; return $this; } /** * Get the additionalProperties value of the parameter * * @return bool|Parameter|null */ public function getAdditionalProperties() { if (is_array($this->additionalProperties)) { $this->additionalProperties = new static($this->additionalProperties, $this->serviceDescription); $this->additionalProperties->setParent($this); } return $this->additionalProperties; } /** * Set the additionalProperties value of the parameter * * @param bool|Parameter|null $additional Boolean to allow any, an Parameter to specify a schema, or false to disallow * * @return self */ public function setAdditionalProperties($additional) { $this->additionalProperties = $additional; return $this; } /** * Set the items data of the parameter * * @param Parameter|null $items Items to set * * @return self */ public function setItems(Parameter $items = null) { if ($this->items = $items) { $this->items->setParent($this); } return $this; } /** * Get the item data of the parameter * * @return Parameter|null */ public function getItems() { if (is_array($this->items)) { $this->items = new static($this->items, $this->serviceDescription); $this->items->setParent($this); } return $this->items; } /** * Get the class that the parameter must implement * * @return null|string */ public function getInstanceOf() { return $this->instanceOf; } /** * Set the class that the parameter must be an instance of * * @param string|null $instanceOf Class or interface name * * @return self */ public function setInstanceOf($instanceOf) { $this->instanceOf = $instanceOf; return $this; } /** * Get the enum of strings that are valid for the parameter * * @return array|null */ public function getEnum() { return $this->enum; } /** * Set the enum of strings that are valid for the parameter * * @param array|null $enum Array of strings or null * * @return self */ public function setEnum(array $enum = null) { $this->enum = $enum; return $this; } /** * Get the regex pattern that must match a value when the value is a string * * @return string */ public function getPattern() { return $this->pattern; } /** * Set the regex pattern that must match a value when the value is a string * * @param string $pattern Regex pattern * * @return self */ public function setPattern($pattern) { $this->pattern = $pattern; return $this; } /** * Get the format attribute of the schema * * @return string */ public function getFormat() { return $this->format; } /** * Set the format attribute of the schema * * @param string $format Format to set (e.g. date, date-time, timestamp, time, date-time-http) * * @return self */ public function setFormat($format) { $this->format = $format; return $this; } }