Introduction
use Wrkflow\GetValue\GetValue;use Wrkflow\GetValue\DataHolders\ArrayData;
$data = new GetValue(new ArrayData([ 'address' => [ 'street' => [ 'number' => '13', ], 'name' => '', ]]));$data->getInt('address.street.number') // Returns: 13 (int)$data->getString('address.street.name') // Returns: null because value does not exists$data->getRequiredString('address.street.name') // Returns: throws MissingValueForKeyException exceptionInstallation
Section titled “Installation”composer require wrkflow/php-get-typed-valueUse of this package is super simple. You need to always create GetValue object with desired data format you are using.
Then you are going to use same methods for any format you choose.
Use with array
Section titled “Use with array”Simple build GetValue class with ArrayData class that will expose the data.
use Wrkflow\GetValue\GetValue;use Wrkflow\GetValue\DataHolders\ArrayData;
$data = GetValue(new ArrayData([ 'page' => 1, 'items' => [ ['name' => 'test', 'tags' => null, 'label' => 'yes'], ['name' => 'test 2', 'tags' => ['test'],] ],]));Use with XML
Section titled “Use with XML”Simple build GetValue class with XMLData class that will expose the data.
use Wrkflow\GetValue\GetValue;use Wrkflow\GetValue\DataHolders\XMLData;use \SimpleXMLElement;
$simpleXMLElement = new SimpleXMLElement('<root><title>test</title><test attribute="test"/></root>');$data = new GetValue(new XMLData($simpleXMLElement));Accessing values
Section titled “Accessing values”- To get value you are required to pass a key path (for array it is index keys, for XML it is node names).
- There are 2 methods for each data type:
For values that are optional
Section titled “For values that are optional”Will return null value if the data does not contain value for given key.
// Returns for example 13 or null$data->getInt('address.street.number')For value that must exists
Section titled “For value that must exists”Ensures that value is present and not null.
// Returns for example 13. For null MissingValueForKeyException is thrown$data->getInt('address.street.number')Dot notation
Section titled “Dot notation”use Wrkflow\GetValue\GetValue;use Wrkflow\GetValue\DataHolders\ArrayData;
$data = new GetValue(new ArrayData([ 'street' => ['number' => 13],]));// Use dot notation$data->getInt('street.number') // Returns: 13// or array key path$data->getInt(['street', 'number']) // Returns: 13If any key in the path contains a dot character, you need to specify the path as an array of path parts.
use Wrkflow\GetValue\GetValue;use Wrkflow\GetValue\DataHolders\ArrayData;
$data = new GetValue(new ArrayData([ 'address' => [ 'street.number' => 14, 'street' => [ 'number' => 13, ], ]]));$data->getInt('address.street.number') // Returns: 13$data->getInt(['address', 'street.number']) // Returns: 14You can also access array elements using their ordered numeric index.
use Wrkflow\GetValue\GetValue;use Wrkflow\GetValue\DataHolders\ArrayData;
$data = new GetValue(new ArrayData([ 'tags' => ['narrow', 'roundabout']]));// Use dot notation$data->getString('tags.0') // Returns: narrow$data->getString('tags.1') // Returns: narrow// or array key path$data->getString(['tags', '0']) // Returns: narrow$data->getString(['tags', '1']) // Returns: roundaboutValidation
Section titled “Validation”- All values are validated within its type definition (int will be checked by IntegerRule, string by StringRule, etc).
- Validation occurs only on non-null values.
- You can additionally add validation rules (as second parameter) to ensure you will get correct value. Check Validation documentation for more.
Supported value types
Section titled “Supported value types”Throws
ValidationFailedExceptionif value is not numeric. Float is truncated.
Get nullable int.
$value = $data->getInt('key');Get existing non-nullable int value. Throws MissingValueForKeyException exception if null.
$value = $data->getRequiredInt('key');Throws
ValidationFailedExceptionif value is not numeric. String value using comma instead of dot are converted to valid float. (1200,50 => 1200.50)
Get nullable float value.
$value = $data->getFloat('key');Get existing non-nullable float value. Throws MissingValueForKeyException exception if null.
$value = $data->getRequiredFloat('key');Values as ‘yes’,‘no’,1,0,‘1’,‘0’,‘true’,‘false’ are converted to bool. This can be globally changed via strategy. Throws
ValidationFailedExceptionif value is not bool.
Get nullable bool value.
$value = $data->getBool('key');Get existing non-nullable bool value. Throws MissingValueForKeyException exception if null.
$value = $data->getRequiredBool('key');String
Section titled “String”String is trimmed and empty string is converted to null . This can be globally changed via strategy. Throws
ValidationFailedExceptionif value is not bool.
Get nullable string value.
$value = $data->getString('key');Get existing non-nullable string value. Throws MissingValueForKeyException exception if null.
$value = $data->getRequiredString('key');Throws
ValidationFailedExceptionif value is not in the enum. In default strategy empty string is treated as null. Works only on string/int enums.
Get nullable enum value from a string/int.
$value = $data->getEnum('key', MyEnum::class);Get existing non-nullable enum value. Throws MissingValueForKeyException exception if missing.
$value = $data->getRequiredEnum('key', MyEnum::class);Date time
Section titled “Date time”Throws
ValidationFailedExceptionif value is not string. Format is not validated and DateTime object will try to parse given value.
Get nullable \DateTime object (return null if empty string).
$value = $data->getDateTime('key');Get existing non-nullable \DateTime object. Throws MissingValueForKeyException exception if missing.
$value = $data->getRequiredDateTime('key');Throws always
NotAnArrayExceptionexception if value exists but is not an array.
Get always an array even if provided data is missing or if null.
$value = $data->getArray('key');Get nullable array.
$value = $data->getNullableArray('key');Get existing non-nullable array that is not empty. Throws ArrayIsEmptyException exception if missing.
$value = $data->getRequiredArray('key');GetValue with ArrayData
Section titled “GetValue with ArrayData”Throws always
NotAnArrayExceptionexception if value exists but is not an array.
Get always GetValue instance even if provided data is missing or if null.
$value = $data->getArrayGetter('key');Try to get nullable array from data and wrap it in GetValue instance.
$value = $data->getNullableArrayGetter('key');Try to get non-empty array from data and wrap it in GetValue instance. Throws ArrayIsEmptyException exception if
missing.
$value = $data->getRequiredArrayGetter('key');Get SimpleXMLElement
Section titled “Get SimpleXMLElement”Since v0.6.0
Return SimpleXMLElement for given key. Uses xml transformer strategy.
$xml = $data->getNullableXML('child');GetValue with XMLData
Section titled “GetValue with XMLData”Since v0.6.0. Throws always
NotXMLExceptionexception if value is not a SimpleXMLElement. XML transformer strategy is applied.
Get always GetValue instance even if provided data is missing or if null.
$value = $data->getXMLGetter('key');Try to get nullable array from data and wrap it in GetValue instance.
$value = $data->getNullableXMLGetter('key');Try to get non-empty array from data and wrap it in GetValue instance. Throws ArrayIsEmptyException exception if
missing.
$value = $data->getRequiredXMLGetter('key');GetValue XML attributes
Section titled “GetValue XML attributes”Since v0.6.0. Throws always
NotXMLExceptionexception if value is not a SimpleXMLElement. XML transformer strategy is applied.
Wraps XML element attributes in GetValue instance (even if attributes are not set in element).
Key contains @attributes like title.@attributes.test.
// Access attributes from root data$rootAttributes = $data->getXMLAttributesGetter();$rootAttributes->getString('attributeName');
// Access attributes from given element$attributes = $data->getXMLAttributesGetter('node');$attributes->getString('attributeName');GetObject
Section titled “GetObject”Since v0.6.1
- Allows getting object of specified type.
- You can transform raw value to expected object by using transformers (with
GetterTransformer) - Use
getObjectif value is nullable - Use
getRequiredObjectto throw missing value exception if value is null (since v0.6.2)
use Wrkflow\GetValue\Contracts\GetValueTransformerContract;use Wrkflow\GetValue\GetValue;use Wrkflow\GetValue\DataHolders\ArrayData;use Wrkflow\GetValue\Transformers\GetterTransformer;
$data = new GetValue(new ArrayData([ 'person' => ['name' => 'Marco', 'surname' => 'Polo'],]));
class PersonEntity{ public function __construct( public readonly string $firstName, public readonly string $lastName, ) { }}
class TestEntityTransformer implements GetValueTransformerContract{ public function transform(GetValue $value, string $key): PersonEntity { return new PersonEntity( firstName: $value->getRequiredString('name'), lastName: $value->getRequiredString('surname'), ); }}
$person = $this->data->getObject( Person::class, 'person', new PersonTransformer());// PersonEntity{firstName=Marco,lastName=Polo}GetValue factory
Section titled “GetValue factory”Since v0.6.3
If you want to set own strategy / exception builder to all GetValue you can leverage the GetValueFactory that helps
you to create GetValue instances from various sources that the package supports. You can create the instance by your
self, or you can use dependency injection.
// Optionally you can change the strategy / exception builder implementation.$factory = new \Wrkflow\GetValue\GetValueFactory( transformerStrategy: new MyTransformerStrategy(), exceptionBuilder: new MyExceptionBuilder(),);$getValueArray = $factory->array([]);$getValueXml = $factory->xml(new SimpleXMLElement('<root />'));Example for Laravel
Exceptions
Section titled “Exceptions”All exceptions receive full key that was used for getting data. You can receive it by using
$exception->getKey()
- ArrayIsEmptyException
- MissingValueForKeyException
- NotAnArrayException
- ValidationFailedException
- Full key format:
- Parent full key is prepended to the key with ’.’ separator (if the GetValue instance was constructed from parent data).
- Array notation is converted to dot notation string.