Skip to content

Commit 2e0e57b

Browse files
committed
Allow passing object to *GetterTransformer instead of closure
1 parent a74dcab commit 2e0e57b

File tree

10 files changed

+124
-18
lines changed

10 files changed

+124
-18
lines changed

docs/content/en/transformers.md

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,10 @@ $transformer = new ArrayItemTransformer(function (mixed $value, string $key): ?a
221221
$values = $data->getArray('names', transformers: [$transformer]);
222222
// Result: [['Marco', 'Polo'], ['Way', 'Point'], null]
223223
```
224-
### GetterTransformer (since v0.6.0)
224+
225+
### GetterTransformer
226+
227+
> Since v0.6.0
225228
226229
Transforms an **array/xml value** in a closure that receives wrapped GetValue instance.
227230

@@ -242,6 +245,34 @@ $value = $data->getString('person', transformers: [$transformer]);
242245
// Result: 'Marco Polo'
243246
```
244247

248+
#### Passing object instead of closure
249+
250+
> Since v0.6.1
251+
252+
To make transformers more re-usable you can pass an object that implements `Wrkflow\GetValue\Contracts\GetValueTransformerContract` interface.
253+
254+
```php
255+
use Wrkflow\GetValue\Contracts\GetValueTransformerContract;
256+
use Wrkflow\GetValue\GetValue;
257+
use Wrkflow\GetValue\DataHolders\ArrayData;
258+
use Wrkflow\GetValue\Transformers\GetterTransformer;
259+
260+
class GetNameTransformer implements GetValueTransformerContract
261+
{
262+
public function transform(GetValue $value, string $key): string
263+
{
264+
return implode(' ', [$value->getRequiredString('name'), $value->getRequiredString('surname')]);
265+
}
266+
}
267+
268+
$data = new GetValue(new ArrayData([
269+
'person' => ['name' => 'Marco', 'surname' => 'Polo'],
270+
]));
271+
272+
$value = $data->getString('person', transformers: [new GetterTransformer(new GetNameTransformer(), true)]);
273+
// Result: 'Marco Polo'
274+
```
275+
245276
### ArrayItemGetterTransformer
246277

247278
> Can be used only with get\*Array\* methods. Throws NotAnArrayException if array value is not an array.
@@ -257,9 +288,10 @@ $data = new GetValue(new ArrayData([
257288
'names' => [['name' => 'Marco', 'surname' => 'Polo'], ['name' => 'Martin', 'surname' => 'Way']]
258289
]));
259290

260-
$transformer = new ArrayItemGetterTransformer(function (GetValue $value, string $key): string {
261-
return $value->getRequiredString('name') . ' '.$value->getRequiredString('surname');
262-
});
291+
$transformer = new ArrayItemGetterTransformer(fn (GetValue $value, string $key): string => implode(' ', [
292+
$value->getRequiredString('name'),
293+
$value->getRequiredString('surname'),
294+
]));
263295

264296
$values = $data->getArray('names', transformers: [$transformer]);
265297
// Result: ['Marco Polo', 'Martin Way']
@@ -268,6 +300,34 @@ $values = $data->getArray('names', transformers: [$transformer]);
268300
If you return `null` in your closure then value is not added to result array. Use `ignoreNullResult: false` in same way
269301
as in [ArrayItemTransformer](#arrayitemtransformer)`.
270302

303+
#### Passing object instead of closure
304+
305+
> Since v0.6.1
306+
307+
To make transformers more re-usable you can pass an object that implements `Wrkflow\GetValue\Contracts\GetValueTransformerContract` interface.
308+
309+
```php
310+
use Wrkflow\GetValue\Contracts\GetValueTransformerContract;
311+
use Wrkflow\GetValue\GetValue;
312+
use Wrkflow\GetValue\DataHolders\ArrayData;
313+
use Wrkflow\GetValue\Transformers\ArrayItemGetterTransformer;
314+
315+
class GetNameTransformer implements GetValueTransformerContract
316+
{
317+
public function transform(GetValue $value, string $key): string
318+
{
319+
return implode(' ', [$value->getRequiredString('name'), $value->getRequiredString('surname')]);
320+
}
321+
}
322+
323+
$data = new GetValue(new ArrayData([
324+
'names' => [['name' => 'Marco', 'surname' => 'Polo'], ['name' => 'Martin', 'surname' => 'Way']]
325+
]));
326+
327+
$values = $data->getArray('names', transformers: [new ArrayItemGetterTransformer(new GetNameTransformer())];
328+
// Result: ['Marco Polo', 'Martin Way']
329+
```
330+
271331
## Customization
272332

273333
You can create your own transformer by extending `Wrkflow\GetValue\Contracts\TransformerContract` class:
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Wrkflow\GetValue\Contracts;
6+
7+
use Wrkflow\GetValue\GetValue;
8+
9+
interface GetValueTransformerContract
10+
{
11+
public function transform(GetValue $value, string $key): mixed;
12+
}

src/DataHolders/XMLData.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public function get(): SimpleXMLElement
4848

4949
protected function normalizeValue(ValueType $valueType, SimpleXMLElement $value): string|array|null|SimpleXMLElement
5050
{
51-
if ($valueType === ValueType::XML) {
51+
if ($valueType === ValueType::Object) {
5252
if ($value->count() === 0) {
5353
return null;
5454
}

src/Enums/ValueType.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ enum ValueType
1212
case String;
1313
case DateTime;
1414
case Array;
15-
case XML;
15+
case Object;
1616
case XMLAttributes;
1717
}

src/GetValue.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ public function getRequiredArrayGetter(string|array $key, ?array $transformers =
399399
public function getNullableXML(
400400
string|array $key,
401401
?array $transformers = null,
402-
ValueType $valueType = ValueType::XML,
402+
ValueType $valueType = ValueType::Object,
403403
): ?SimpleXMLElement {
404404
$value = $this->getValidatedValue(
405405
valueType: $valueType,
@@ -426,7 +426,7 @@ public function getNullableXML(
426426
public function getRequiredXML(
427427
string|array $key,
428428
?array $transformers = null,
429-
ValueType $valueType = ValueType::XML,
429+
ValueType $valueType = ValueType::Object,
430430
): SimpleXMLElement {
431431
$value = $this->getNullableXML(key: $key, transformers: $transformers, valueType: $valueType);
432432

src/Transformers/ArrayItemGetterTransformer.php

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

77
use Closure;
8+
use Wrkflow\GetValue\Contracts\GetValueTransformerContract;
89
use Wrkflow\GetValue\DataHolders\AbstractData;
910
use Wrkflow\GetValue\Exceptions\NotSupportedDataException;
1011
use Wrkflow\GetValue\GetValue;
@@ -15,12 +16,12 @@
1516
class ArrayItemGetterTransformer extends AbstractArrayItemTransformer
1617
{
1718
/**
18-
* @param Closure(GetValue,string):mixed $onItem
19-
* @param bool $ignoreNullResult Allows to prevent adding null value to array when
19+
* @param Closure(GetValue,string):mixed|GetValueTransformerContract $onItem
20+
* @param bool $ignoreNullResult Allows to prevent adding null value to array when
2021
* rebuilding an array.
2122
*/
2223
public function __construct(
23-
private readonly Closure $onItem,
24+
private readonly Closure|GetValueTransformerContract $onItem,
2425
private readonly bool $beforeValidation = false,
2526
private readonly bool $ignoreNullResult = true,
2627
) {
@@ -41,6 +42,10 @@ protected function transformItem(mixed $item, string $key, string|int $index, Ge
4142

4243
$getItemValue = $getValue->makeInstance($data);
4344

45+
if ($this->onItem instanceof GetValueTransformerContract) {
46+
return $this->onItem->transform($getItemValue, $key);
47+
}
48+
4449
return call_user_func_array($this->onItem, [$getItemValue, $key]);
4550
}
4651

src/Transformers/GetterTransformer.php

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

77
use Closure;
8+
use Wrkflow\GetValue\Contracts\GetValueTransformerContract;
89
use Wrkflow\GetValue\Contracts\TransformerContract;
910
use Wrkflow\GetValue\DataHolders\AbstractData;
1011
use Wrkflow\GetValue\GetValue;
@@ -18,7 +19,7 @@ class GetterTransformer implements TransformerContract
1819
* @param Closure(GetValue,string):mixed $closure
1920
*/
2021
public function __construct(
21-
private readonly Closure $closure,
22+
private readonly Closure|GetValueTransformerContract $closure,
2223
private readonly bool $beforeValidation = false
2324
) {
2425
}
@@ -38,6 +39,10 @@ public function transform(mixed $value, string $key, GetValue $getValue): mixed
3839

3940
$getItemValue = $getValue->makeInstance($data);
4041

42+
if ($this->closure instanceof GetValueTransformerContract) {
43+
return $this->closure->transform($getItemValue, $key);
44+
}
45+
4146
return call_user_func_array($this->closure, [$getItemValue, $key]);
4247
}
4348
}

tests/Transformers/ArrayItemGetterTransformerTest.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,16 @@ public function testExampleArray(): void
3232
]],
3333
]));
3434

35-
$transformer = new ArrayItemGetterTransformer(fn (GetValue $value, string $key): string => $value->getRequiredString(
36-
'name'
37-
) . ' ' . $value->getRequiredString('surname'));
35+
$transformer = new ArrayItemGetterTransformer(fn (GetValue $value, string $key): string => implode(' ', [
36+
$value->getRequiredString('name'),
37+
$value->getRequiredString('surname'),
38+
]));
3839

3940
$values = $data->getArray('names', transformers: [$transformer]);
4041
$this->assertEquals(['Marco Polo', 'Martin Way'], $values);
42+
43+
$values = $data->getArray('names', transformers: [new ArrayItemGetterTransformer(new GetNameTransformer())]);
44+
$this->assertEquals(['Marco Polo', 'Martin Way'], $values);
4145
}
4246

4347
public function testExampleXML(): void
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Wrkflow\GetValueTests\Transformers;
6+
7+
use Wrkflow\GetValue\Contracts\GetValueTransformerContract;
8+
use Wrkflow\GetValue\GetValue;
9+
10+
class GetNameTransformer implements GetValueTransformerContract
11+
{
12+
public function transform(GetValue $value, string $key): string
13+
{
14+
return implode(' ', [$value->getRequiredString('name'), $value->getRequiredString('surname')]);
15+
}
16+
}

tests/Transformers/GetterTransformerTest.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@ public function testExample(): void
2323
],
2424
]));
2525

26-
$transformer = new GetterTransformer(fn (GetValue $value, string $key): string => $value->getRequiredString(
27-
'name'
28-
) . ' ' . $value->getRequiredString('surname'), true);
26+
$transformer = new GetterTransformer(fn (GetValue $value, string $key): string => implode(' ', [
27+
$value->getRequiredString('name'),
28+
$value->getRequiredString('surname'),
29+
]), true);
2930

3031
$value = $data->getString('person', transformers: [$transformer]);
3132
$this->assertEquals('Marco Polo', $value);
33+
34+
$value = $data->getString('person', transformers: [new GetterTransformer(new GetNameTransformer(), true)]);
35+
$this->assertEquals('Marco Polo', $value);
3236
}
3337

3438
public function dataToTest(): array

0 commit comments

Comments
 (0)