Skip to content

Commit b5e6c9a

Browse files
committed
Add ArrayGetterTransformer to get array object wrapped in GetValue + improve docs
- Improve transformer documentation with data example
1 parent 7022349 commit b5e6c9a

File tree

4 files changed

+282
-59
lines changed

4 files changed

+282
-59
lines changed

docs/content/en/transformers.md

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,16 @@ $data = new GetValue(data: $array, transformerStrategy: new NoTransformerStrateg
2222

2323
## Transformers
2424

25-
> Transformers argument in get* methods overrides transformers from strategy.
25+
> Transformers argument in get* methods overrides transformers from strategy.
2626
2727
To disable default transformers set `transformers` argument to empty array.
2828

2929
```php
30+
$getValue = new \Wrkflow\GetValue\GetValue(new \Wrkflow\GetValue\DataHolders\ArrayData([
31+
'key' => ' ',
32+
]));
3033
$value = $getValue->getString('key', []);
34+
// $value === ' '
3135
```
3236

3337
### TransformToBool
@@ -36,7 +40,11 @@ Transforms most used representations of boolean in string or number ('yes','no',
3640
it to bool **before** validation starts.
3741

3842
```php
39-
$getValue->getBool('key', [new \Wrkflow\GetValue\Transformers\TransformToBool()]);
43+
$getValue = new \Wrkflow\GetValue\GetValue(new \Wrkflow\GetValue\DataHolders\ArrayData([
44+
'key' => 'yes',
45+
]));
46+
$value = $getValue->getBool('key', [new \Wrkflow\GetValue\Transformers\TransformToBool()]);
47+
// $value === true
4048
```
4149

4250
### TrimAndEmptyStringToNull
@@ -46,7 +54,11 @@ $getValue->getBool('key', [new \Wrkflow\GetValue\Transformers\TransformToBool()]
4654
Ensures that string is trimmed and transformed to null (if empty string is provided) **before** validation starts.
4755

4856
```php
49-
$getValue->getString('key', [new \Wrkflow\GetValue\Transformers\TrimAndEmptyStringToNull()]);
57+
$getValue = new \Wrkflow\GetValue\GetValue(new \Wrkflow\GetValue\DataHolders\ArrayData([
58+
'key' => '',
59+
]));
60+
$value = $getValue->getString('key', [new \Wrkflow\GetValue\Transformers\TrimAndEmptyStringToNull()]);
61+
// $value === null
5062
```
5163

5264
### TrimString
@@ -55,7 +67,11 @@ Ensures that string is trimmed **before** validation starts.
5567

5668
```php
5769
// Get trimmed string (no '' to null transformation)
58-
$getValue->getString('key', [new \Wrkflow\GetValue\Transformers\TrimString()]);
70+
$getValue = new \Wrkflow\GetValue\GetValue(new \Wrkflow\GetValue\DataHolders\ArrayData([
71+
'key' => 'Marco Polo ',
72+
]));
73+
$value = $getValue->getString('key', [new \Wrkflow\GetValue\Transformers\TrimString()]);
74+
// $value === 'Marco Polo'
5975
```
6076

6177
### ClosureTransformer
@@ -65,6 +81,9 @@ $getValue->getString('key', [new \Wrkflow\GetValue\Transformers\TrimString()]);
6581
Transforms the value using closure. Ensure you are returning correct type based on the `get` method you have choosed.
6682

6783
```php
84+
$getValue = new \Wrkflow\GetValue\GetValue(new \Wrkflow\GetValue\DataHolders\ArrayData([
85+
'key' => 'Marco Polo',
86+
]));
6887
$transformer = new ClosureTransformer(function (mixed $value, string $key): ?string {
6988
if ($value === null) {
7089
return null;
@@ -82,6 +101,9 @@ $md5 = $getValue->getString('key', [$transformer]);
82101
Transforms valid array using closure. Always return an array.
83102

84103
```php
104+
$getValue = new \Wrkflow\GetValue\GetValue(new \Wrkflow\GetValue\DataHolders\ArrayData([
105+
'key' => ['Marco', 'Polo']
106+
]));
85107
$transformer = new ArrayTransformer(function (array $value, string $key): array {
86108
return array_map(fn (string $value) => md5($value), $value);
87109
});
@@ -96,6 +118,9 @@ $values = $getValue->getArray('key', [$transformer]);
96118
Transforms **each value in an array** using closure.
97119

98120
```php
121+
$getValue = new \Wrkflow\GetValue\GetValue(new \Wrkflow\GetValue\DataHolders\ArrayData([
122+
'key' => ['Marco', 'Polo']
123+
]));
99124
$transformer = new ArrayItemTransformer( function (mixed $value, string $key): string {
100125
if (is_string($value) !== null) {
101126
throw new ValidationFailedException($key, 'array value not a string');
@@ -114,9 +139,31 @@ $values = $getValue->getArray('key', [$transformer]);
114139
Transforms an **array that contains array values** in a closure that receives wrapped array in GetValue.
115140

116141
```php
142+
$getValue = new \Wrkflow\GetValue\GetValue(new \Wrkflow\GetValue\DataHolders\ArrayData([
143+
'key' => [['test' => 'Marco'], ['test' => 'Polo']]
144+
]));
117145
$transformer = new ArrayItemGetterTransformer( function (\Wrkflow\GetValue\GetValue $value, string $key): string {
118146
return [
119-
self::KeyValue => $value->getRequiredString(self::KeyValue),
147+
'test' => $value->getRequiredString('test'),
148+
];
149+
});
150+
151+
$values = $getValue->getArray('key', [$transformer]);
152+
```
153+
154+
### ArrayItemGetterTransformer
155+
156+
> Can be used only with get\*Array\* methods.
157+
158+
Transforms an **array** in a closure that receives wrapped array in GetValue.
159+
160+
```php
161+
$getValue = new \Wrkflow\GetValue\GetValue(new \Wrkflow\GetValue\DataHolders\ArrayData([
162+
'key' => ['test' => 'Value!']
163+
]));
164+
$transformer = new ArrayGetterTransformer( function (\Wrkflow\GetValue\GetValue $value, string $key): string {
165+
return [
166+
'test' => $value->getRequiredString('test'),
120167
];
121168
});
122169

@@ -131,10 +178,10 @@ You can create your own transformer by extending:
131178
- Reset of values `Wrkflow\GetValue\Contracts\TransformerContract`
132179

133180
Then implement `public function transform(mixed $value, string $key): mixed;`. Expect invalid value and make do not
134-
transform the value if it is invalid. Just return it.
181+
transform the value if it is invalid. Just return it.
135182

136183
Then implement `public function beforeValidation(mixed $value, string $key): bool;` which ensures that transformation
137-
is not done before validation.
184+
is not done before validation.
138185

139186
Then change the strategy:
140187

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Wrkflow\GetValue\Transformers;
6+
7+
use Closure;
8+
use Wrkflow\GetValue\Contracts\TransformerArrayContract;
9+
use Wrkflow\GetValue\DataHolders\ArrayData;
10+
use Wrkflow\GetValue\GetValue;
11+
12+
/**
13+
* Transforms the value using closure after validation has been done.
14+
*/
15+
class ArrayGetterTransformer implements TransformerArrayContract
16+
{
17+
/**
18+
* @param Closure(array,string):array $closure
19+
* @param bool $beforeValidation
20+
*/
21+
public function __construct(
22+
private readonly Closure $closure,
23+
private readonly bool $beforeValidation = false
24+
) {
25+
}
26+
27+
public function beforeValidation(mixed $value, string $key): bool
28+
{
29+
return $this->beforeValidation;
30+
}
31+
32+
public function transform(mixed $value, string $key, GetValue $getValue): ?array
33+
{
34+
if (is_array($value) === false) {
35+
return null;
36+
}
37+
38+
$getItemValue = $getValue->makeInstance(new ArrayData($value));
39+
40+
return call_user_func_array($this->closure, [$getItemValue, $key]);
41+
}
42+
}
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Wrkflow\GetValueTests\Transformers;
6+
7+
use Closure;
8+
use Wrkflow\GetValue\Contracts\TransformerArrayContract;
9+
use Wrkflow\GetValue\GetValue;
10+
use Wrkflow\GetValue\Transformers\ArrayGetterTransformer;
11+
12+
class ArrayGetterTransformerTest extends AbstractTransformerTestCase
13+
{
14+
final public const Key = 'key';
15+
16+
public function dataToTest(): array
17+
{
18+
return $this->dataAfterValidationForTransformer();
19+
}
20+
21+
public function dataToTestBeforeValidation(): array
22+
{
23+
return $this->createData(false);
24+
}
25+
26+
/**
27+
* @dataProvider dataToTestBeforeValidation
28+
*/
29+
public function testBeforeValidation(TransformerExpectationEntity $entity): void
30+
{
31+
$this->assertValue($this->getBeforeValidationTransformer(), $entity);
32+
}
33+
34+
public function dataToAfterValidationForce(): array
35+
{
36+
return $this->dataAfterValidationForTransformer();
37+
}
38+
39+
/**
40+
* @dataProvider dataToAfterValidationForce
41+
*/
42+
public function testAfterValidationForce(TransformerExpectationEntity $entity): void
43+
{
44+
$this->assertValue($this->getForceAfterValidation(), $entity);
45+
}
46+
47+
protected function dataAfterValidationForTransformer(): array
48+
{
49+
return $this->createData(true);
50+
}
51+
52+
protected function getClosure(): Closure
53+
{
54+
return function (GetValue $value, string $key): array {
55+
$this->assertEquals('test', $key, 'Key does not match up');
56+
57+
return [
58+
// Remove transformers (we are using empty string)
59+
self::Key => md5($value->getRequiredString(self::Key, transformers: [])),
60+
];
61+
};
62+
}
63+
64+
protected function getTransformer(): TransformerArrayContract
65+
{
66+
return new ArrayGetterTransformer($this->getClosure());
67+
}
68+
69+
protected function getBeforeValidationTransformer(): TransformerArrayContract
70+
{
71+
return new ArrayGetterTransformer(closure: $this->getClosure(), beforeValidation: true);
72+
}
73+
74+
protected function getForceAfterValidation(): TransformerArrayContract
75+
{
76+
return new ArrayGetterTransformer(closure: $this->getClosure(), beforeValidation: false);
77+
}
78+
79+
protected function createData(bool $beforeValueIsSameAsValue): array
80+
{
81+
return [
82+
[
83+
new TransformerExpectationEntity(
84+
value: [
85+
self::Key => '',
86+
],
87+
expectedValue: [
88+
self::Key => 'd41d8cd98f00b204e9800998ecf8427e',
89+
],
90+
expectedValueBeforeValidation: $beforeValueIsSameAsValue ? [
91+
self::Key => '',
92+
] : null
93+
),
94+
],
95+
[
96+
new TransformerExpectationEntity(
97+
value: [
98+
self::Key => ' ',
99+
],
100+
expectedValue: [
101+
self::Key => '7215ee9c7d9dc229d2921a40e899ec5f',
102+
],
103+
expectedValueBeforeValidation: $beforeValueIsSameAsValue ? [
104+
self::Key => ' ',
105+
] : null
106+
),
107+
],
108+
[
109+
new TransformerExpectationEntity(
110+
value: [
111+
self::Key => ' asd ',
112+
],
113+
expectedValue: [
114+
self::Key => '81c24eeebdef51c832407fa3e4509ab8',
115+
],
116+
expectedValueBeforeValidation: $beforeValueIsSameAsValue ? [
117+
self::Key => ' asd ',
118+
] : null
119+
),
120+
],
121+
[
122+
new TransformerExpectationEntity(
123+
value: [
124+
self::Key => 'asd ',
125+
],
126+
expectedValue: [
127+
self::Key => '4fe2077508f28d88bfa1473149415224',
128+
],
129+
expectedValueBeforeValidation: $beforeValueIsSameAsValue ? [
130+
self::Key => 'asd ',
131+
] : null
132+
),
133+
],
134+
[
135+
new TransformerExpectationEntity(
136+
value: [
137+
self::Key => 'asd mix',
138+
],
139+
expectedValue: [
140+
self::Key => 'bf40744fb5eeca1029aed8d8c5d30f82',
141+
],
142+
expectedValueBeforeValidation: $beforeValueIsSameAsValue ? [
143+
self::Key => 'asd mix',
144+
] : null
145+
),
146+
],
147+
// Closure not called
148+
[new TransformerExpectationEntity(value: null, expectedValue: null)],
149+
];
150+
}
151+
}

0 commit comments

Comments
 (0)