Skip to content

Commit 4c44a6b

Browse files
committed
Add array item transformer that has wrapped array value in GetValue instance
- Make $getValue->makeInstance public. - Renamed `ClosureArrayItemsTransformer` to `ArrayItemTransformer` - Renamed `ClosureArrayTransformer` to `ArrayTransformer` - Transformers `transform` method has new parameter `GetValue $getValue`
1 parent e0f8f16 commit 4c44a6b

17 files changed

+338
-48
lines changed

docs/content/en/transformers.md

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,30 +75,28 @@ $transformer = new ClosureTransformer(function (mixed $value, string $key): ?str
7575
$md5 = $getValue->getString('key', [$transformer]);
7676
```
7777

78-
### ClosureArrayTransformer
78+
### ArrayTransformer
7979

80-
> Cant be used only with get\*Array\* methods.
80+
> Can be used only with get\*Array\* methods.
8181
8282
Transforms valid array using closure. Always return an array.
8383

8484
```php
85-
$transformer = new ClosureArrayTransformer(function (array $value, string $key): array {
85+
$transformer = new ArrayTransformer(function (array $value, string $key): array {
8686
return array_map(fn (string $value) => md5($value), $value);
8787
});
8888

8989
$values = $getValue->getArray('key', [$transformer]);
9090
```
9191

92-
### ClosureArrayItemsTransformer
92+
### ArrayItemTransformer
9393

94-
> Cant be used only with get\*Array\* methods.
94+
> Can be used only with get\*Array\* methods.
9595
9696
Transforms **each value in an array** using closure.
9797

9898
```php
99-
$transformer = new ClosureArrayItemsTransformer( function (mixed $value, string $key): string {
100-
$this->assertEquals('test', $key, 'Key does not match up');
101-
99+
$transformer = new ArrayItemTransformer( function (mixed $value, string $key): string {
102100
if (is_string($value) !== null) {
103101
throw new ValidationFailedException($key, 'array value not a string');
104102
}
@@ -109,6 +107,22 @@ $transformer = new ClosureArrayItemsTransformer( function (mixed $value, string
109107
$values = $getValue->getArray('key', [$transformer]);
110108
```
111109

110+
### ArrayItemGetterTransformer
111+
112+
> Can be used only with get\*Array\* methods. Throws NotAnArrayException if array value is not an array.
113+
114+
Transforms an **array that contains array values** in a closure that receives wrapped array in GetValue.
115+
116+
```php
117+
$transformer = new ArrayItemGetterTransformer( function (\Wrkflow\GetValue\GetValue $value, string $key): string {
118+
return [
119+
self::KeyValue => $value->getRequiredString(self::KeyValue),
120+
];
121+
});
122+
123+
$values = $getValue->getArray('key', [$transformer]);
124+
```
125+
112126
## Customization
113127

114128
You can create your own transformer by extending:

src/Actions/GetValidatedValueAction.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
use Wrkflow\GetValue\Contracts\RuleContract;
88
use Wrkflow\GetValue\Contracts\TransformerContract;
9-
use Wrkflow\GetValue\DataHolders\AbstractData;
9+
use Wrkflow\GetValue\GetValue;
1010

1111
class GetValidatedValueAction
1212
{
@@ -19,15 +19,15 @@ public function __construct(
1919
* @param array<RuleContract> $rules
2020
* @param array<TransformerContract> $transforms
2121
*/
22-
public function execute(AbstractData $data, string $key, array $rules, array $transforms): mixed
22+
public function execute(GetValue $getValue, string $key, array $rules, array $transforms): mixed
2323
{
24-
$value = $data->getValue($key);
24+
$value = $getValue->data->getValue($key);
2525

2626
$afterValidationTransforms = [];
2727

2828
foreach ($transforms as $transform) {
2929
if ($rules === [] || $transform->beforeValidation(value: $value, key: $key)) {
30-
$value = $transform->transform(value: $value, key: $key);
30+
$value = $transform->transform(value: $value, key: $key, getValue: $getValue);
3131
} else {
3232
$afterValidationTransforms[] = $transform;
3333
}
@@ -45,7 +45,7 @@ public function execute(AbstractData $data, string $key, array $rules, array $tr
4545
$this->validateAction->execute(rules: $rules, value: $value, key: $key);
4646

4747
foreach ($afterValidationTransforms as $transform) {
48-
$value = $transform->transform($value, $key);
48+
$value = $transform->transform(value: $value, key: $key, getValue: $getValue);
4949
}
5050

5151
return $value;

src/Contracts/TransformerArrayContract.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
namespace Wrkflow\GetValue\Contracts;
66

7+
use Wrkflow\GetValue\GetValue;
8+
79
interface TransformerArrayContract extends TransformerContract
810
{
9-
public function transform(mixed $value, string $key): ?array;
11+
public function transform(mixed $value, string $key, GetValue $getValue): ?array;
1012
}

src/Contracts/TransformerContract.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
namespace Wrkflow\GetValue\Contracts;
66

7+
use Wrkflow\GetValue\GetValue;
8+
79
interface TransformerContract
810
{
911
public function beforeValidation(mixed $value, string $key): bool;
1012

11-
public function transform(mixed $value, string $key): mixed;
13+
public function transform(mixed $value, string $key, GetValue $getValue): mixed;
1214
}

src/GetValue.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,16 @@ public function getRequiredArrayGetter(string $key, ?array $transformers = null)
320320
return $this->makeInstance(new ArrayData($value));
321321
}
322322

323+
public function makeInstance(AbstractData $data): self
324+
{
325+
return new self(
326+
data: $data,
327+
transformerStrategy: $this->transformerStrategy,
328+
exceptionBuilder: $this->exceptionBuilder,
329+
getValidatedValueAction: $this->getValidatedValueAction
330+
);
331+
}
332+
323333
/**
324334
* @param array<RuleContract> $rules
325335
* @param RuleContract|null $mainRule Adds given rule before all given rules.
@@ -335,16 +345,6 @@ protected function getValidatedValue(
335345
$rules = array_merge([$mainRule], $rules);
336346
}
337347

338-
return $this->getValidatedValueAction->execute($this->data, $key, $rules, $transformers);
339-
}
340-
341-
protected function makeInstance(AbstractData $data): self
342-
{
343-
return new self(
344-
data: $data,
345-
transformerStrategy: $this->transformerStrategy,
346-
exceptionBuilder: $this->exceptionBuilder,
347-
getValidatedValueAction: $this->getValidatedValueAction
348-
);
348+
return $this->getValidatedValueAction->execute($this, $key, $rules, $transformers);
349349
}
350350
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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\Exceptions\NotAnArrayException;
11+
use Wrkflow\GetValue\GetValue;
12+
13+
/**
14+
* Re-build an array with array items that are wrapped within GetValue wrapper
15+
*/
16+
class ArrayItemGetterTransformer implements TransformerArrayContract
17+
{
18+
/**
19+
* @param Closure(GetValue,string):array $onItem
20+
* @param bool $beforeValidation
21+
*/
22+
public function __construct(
23+
private readonly Closure $onItem,
24+
private readonly bool $beforeValidation = false
25+
) {
26+
}
27+
28+
public function beforeValidation(mixed $value, string $key): bool
29+
{
30+
return $this->beforeValidation;
31+
}
32+
33+
/**
34+
* @param mixed|array<array> $value
35+
*/
36+
public function transform(mixed $value, string $key, GetValue $getValue): ?array
37+
{
38+
if (is_array($value) === false) {
39+
return null;
40+
}
41+
42+
$items = [];
43+
foreach ($value as $index => $item) {
44+
if (is_array($item) === false) {
45+
throw new NotAnArrayException($key . ' at ' . $index);
46+
}
47+
48+
$getItemValue = $getValue->makeInstance(new ArrayData($item));
49+
50+
$items[$index] = call_user_func_array($this->onItem, [$getItemValue, $key]);
51+
}
52+
53+
return $items;
54+
}
55+
}

src/Transformers/ClosureArrayItemsTransformer.php renamed to src/Transformers/ArrayItemTransformer.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66

77
use Closure;
88
use Wrkflow\GetValue\Contracts\TransformerArrayContract;
9+
use Wrkflow\GetValue\GetValue;
910

1011
/**
1112
* Re-build the array with a closure for each item
1213
*/
13-
class ClosureArrayItemsTransformer implements TransformerArrayContract
14+
class ArrayItemTransformer implements TransformerArrayContract
1415
{
1516
/**
1617
* @param Closure(mixed,string):(array|null) $onItem
@@ -27,7 +28,7 @@ public function beforeValidation(mixed $value, string $key): bool
2728
return $this->beforeValidation;
2829
}
2930

30-
public function transform(mixed $value, string $key): ?array
31+
public function transform(mixed $value, string $key, GetValue $getValue): ?array
3132
{
3233
if (is_array($value) === false) {
3334
return null;

src/Transformers/ClosureArrayTransformer.php renamed to src/Transformers/ArrayTransformer.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66

77
use Closure;
88
use Wrkflow\GetValue\Contracts\TransformerArrayContract;
9+
use Wrkflow\GetValue\GetValue;
910

1011
/**
1112
* Transforms the value using closure after validation has been done.
1213
*/
13-
class ClosureArrayTransformer implements TransformerArrayContract
14+
class ArrayTransformer implements TransformerArrayContract
1415
{
1516
/**
1617
* @param Closure(array,string):array $closure
@@ -27,7 +28,7 @@ public function beforeValidation(mixed $value, string $key): bool
2728
return $this->beforeValidation;
2829
}
2930

30-
public function transform(mixed $value, string $key): ?array
31+
public function transform(mixed $value, string $key, GetValue $getValue): ?array
3132
{
3233
if (is_array($value) === false) {
3334
return null;

src/Transformers/ClosureTransformer.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Closure;
88
use Wrkflow\GetValue\Contracts\TransformerContract;
9+
use Wrkflow\GetValue\GetValue;
910

1011
/**
1112
* Transforms the value using closure after validation has been done.
@@ -27,7 +28,7 @@ public function beforeValidation(mixed $value, string $key): bool
2728
return $this->beforeValidation;
2829
}
2930

30-
public function transform(mixed $value, string $key): mixed
31+
public function transform(mixed $value, string $key, GetValue $getValue): mixed
3132
{
3233
return call_user_func_array($this->closure, [$value, $key]);
3334
}

src/Transformers/TransformToBool.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Wrkflow\GetValue\Transformers;
66

77
use Wrkflow\GetValue\Contracts\TransformerContract;
8+
use Wrkflow\GetValue\GetValue;
89

910
/**
1011
* Transforms most used representations of boolean in string or number ('yes','no',1,0,'1','0','true','false') and
@@ -17,7 +18,7 @@ public function beforeValidation(mixed $value, string $key): bool
1718
return true;
1819
}
1920

20-
public function transform(mixed $value, string $key): mixed
21+
public function transform(mixed $value, string $key, GetValue $getValue): mixed
2122
{
2223
// Ensure that value is boolean
2324
if ($value === 'true' || $value === true || $value === '1' || $value === 1 || $value === 'yes') {

0 commit comments

Comments
 (0)