originalData = $data; if (isset($options['description'])) { $this->serviceDescription = $options['description']; if (!($this->serviceDescription instanceof DescriptionInterface)) { throw new \InvalidArgumentException('description must be a Description'); } if (isset($data['$ref'])) { if ($model = $this->serviceDescription->getModel($data['$ref'])) { $name = isset($data['name']) ? $data['name'] : null; $data = $model->toArray() + $data; 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 = $this->serviceDescription->getModel($data['extends'])) { $data += $extends->toArray(); } } } // Pull configuration data into the parameter foreach ($data as $key => $value) { $this->{$key} = $value; } $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() { return $this->originalData; } /** * 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) { if ($this->static || ($this->default !== null && $value === null)) { return $this->default; } return $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 * @throws \RuntimeException when trying to format when no service * description is available. */ public function filter($value) { // Formats are applied exclusively and supersed filters if ($this->format) { if (!$this->serviceDescription) { throw new \RuntimeException('No service description was set so ' . 'the value cannot be formatted.'); } return $this->serviceDescription->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; } /** * Set the name of the parameter * * @param string $name Name to set */ public function setName($name) { $this->name = $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; } /** * Get the type(s) of the parameter * * @return string|array */ public function getType() { return $this->type; } /** * Get if the parameter is required * * @return bool */ public function isRequired() { return $this->required; } /** * Get the default value of the parameter * * @return string|null */ public function getDefault() { return $this->default; } /** * Get the description of the parameter * * @return string|null */ public function getDescription() { return $this->description; } /** * Get the minimum acceptable value for an integer * * @return int|null */ public function getMinimum() { return $this->minimum; } /** * Get the maximum acceptable value for an integer * * @return int|null */ public function getMaximum() { return $this->maximum; } /** * Get the minimum allowed length of a string value * * @return int */ public function getMinLength() { return $this->minLength; } /** * Get the maximum allowed length of a string value * * @return int|null */ public function getMaxLength() { return $this->maxLength; } /** * Get the maximum allowed number of items in an array value * * @return int|null */ public function getMaxItems() { return $this->maxItems; } /** * Get the minimum allowed number of items in an array value * * @return int */ public function getMinItems() { return $this->minItems; } /** * Get the location of the parameter * * @return string|null */ public function getLocation() { return $this->location; } /** * 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; } /** * Retrieve a known property from the parameter by name or a data property * by name. When no specific name value is passed, 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; } elseif (isset($this->data[$name])) { return $this->data[$name]; } elseif (isset($this->{$name})) { return $this->{$name}; } return null; } /** * Get whether or not the default value can be changed * * @return bool */ public function isStatic() { return $this->static; } /** * Get an array of filters used by the parameter * * @return array */ public function getFilters() { return $this->filters ?: []; } /** * Get the properties of the parameter * * @return Parameter[] */ public function getProperties() { if (!$this->propertiesCache) { $this->propertiesCache = []; 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], ['description' => $this->serviceDescription] ); } return $this->properties[$name]; } /** * 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, ['description' => $this->serviceDescription] ); } return $this->additionalProperties; } /** * Get the item data of the parameter * * @return Parameter */ public function getItems() { if (is_array($this->items)) { $this->items = new static( $this->items, ['description' => $this->serviceDescription] ); } return $this->items; } /** * Get the enum of strings that are valid for the parameter * * @return array|null */ public function getEnum() { return $this->enum; } /** * Get the regex pattern that must match a value when the value is a string * * @return string */ public function getPattern() { return $this->pattern; } /** * Get the format attribute of the schema * * @return string */ public function getFormat() { return $this->format; } /** * Set the array of filters used by the parameter * * @param array $filters Array of functions to use as filters * * @return self */ private function setFilters(array $filters) { $this->filters = []; 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 */ private 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 = [$filter]; } else { $this->filters[] = $filter; } return $this; } /** * Check if a parameter has a specific variable and if it set. * * @param string $var * @return bool */ public function has($var) { if (!is_string($var)) { throw new \InvalidArgumentException('Expected a string. Got: ' . (is_object($var) ? get_class($var) : gettype($var))); } return isset($this->{$var}) && !empty($this->{$var}); } }