Skip to content

Commit a85b562

Browse files
authored
Merge pull request #4 from Shureban/v0.4.0
support setters
2 parents 573474c + 0014740 commit a85b562

12 files changed

+133
-25
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
}
1818
],
1919
"minimum-stability": "dev",
20-
"version": "0.3.0",
20+
"version": "0.4.0",
2121
"autoload": {
2222
"psr-4": {
2323
"Shureban\\LaravelObjectMapper\\": "src/"

src/Attributes/SetterName.php

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

33
namespace Shureban\LaravelObjectMapper\Attributes;
44

5+
use Str;
56
use Stringable;
67

78
class SetterName implements Stringable
@@ -21,6 +22,6 @@ public function __construct(string $paramName)
2122
*/
2223
public function __toString(): string
2324
{
24-
return sprintf('set%s', ucfirst($this->paramName));
25+
return Str::camel(sprintf('set_%s', $this->paramName));
2526
}
2627
}

src/ObjectAnalyzer.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
namespace Shureban\LaravelObjectMapper;
44

55
use ReflectionClass;
6+
use ReflectionException;
67
use ReflectionProperty;
8+
use Shureban\LaravelObjectMapper\Exceptions\UnknownPropertyTypeException;
79

810
class ObjectAnalyzer
911
{
@@ -16,6 +18,8 @@ public function __construct(object $result)
1618

1719
/**
1820
* @return array|Property[]
21+
* @throws UnknownPropertyTypeException
22+
* @throws ReflectionException
1923
*/
2024
public function getProperties(): array
2125
{

src/ObjectMapper.php

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
namespace Shureban\LaravelObjectMapper;
44

55
use Illuminate\Foundation\Http\FormRequest;
6+
use ReflectionException;
67
use Shureban\LaravelObjectMapper\Attributes\SetterName;
78
use Shureban\LaravelObjectMapper\Exceptions\UnknownDataFormatException;
9+
use Shureban\LaravelObjectMapper\Exceptions\UnknownPropertyTypeException;
810

911
class ObjectMapper
1012
{
@@ -22,6 +24,8 @@ public function __construct(object $result)
2224
* @param string|array|FormRequest $data
2325
*
2426
* @return object
27+
* @throws ReflectionException
28+
* @throws UnknownPropertyTypeException
2529
*/
2630
public function map(string|array|FormRequest $data): object
2731
{
@@ -37,20 +41,23 @@ public function map(string|array|FormRequest $data): object
3741
* @param string $data
3842
*
3943
* @return object
44+
* @throws ReflectionException
45+
* @throws UnknownPropertyTypeException
4046
*/
4147
public function mapFromJson(string $data): object
4248
{
43-
$data = json_decode($data, true);
44-
45-
return $this->mapFromArray($data);
49+
return $this->mapData(json_decode($data, true), $data);
4650
}
4751

4852
/**
49-
* @param array $data
53+
* @param array $data
54+
* @param string|array|FormRequest $defaultData
5055
*
5156
* @return object
57+
* @throws ReflectionException
58+
* @throws UnknownPropertyTypeException
5259
*/
53-
public function mapFromArray(array $data): object
60+
private function mapData(array $data, string|array|FormRequest $defaultData): object
5461
{
5562
$analyzer = new ObjectAnalyzer($this->result);
5663
$properties = $analyzer->getProperties();
@@ -68,7 +75,7 @@ public function mapFromArray(array $data): object
6875
$value = $data[$dataPropertyName];
6976

7077
if ($analyzer->hasSetter($setterName)) {
71-
call_user_func_array([$this->result, $setterName], [$value, $data]);
78+
call_user_func_array([$this->result, $setterName], [$value, $defaultData]);
7279
continue;
7380
}
7481

@@ -78,16 +85,30 @@ public function mapFromArray(array $data): object
7885
return $this->result;
7986
}
8087

88+
/**
89+
* @param array $data
90+
*
91+
* @return object
92+
* @throws UnknownPropertyTypeException
93+
* @throws ReflectionException
94+
*/
95+
public function mapFromArray(array $data): object
96+
{
97+
return $this->mapData($data, $data);
98+
}
99+
81100
/**
82101
* @param FormRequest $request
83102
* @param bool $onlyValidated
84103
*
85104
* @return object
105+
* @throws ReflectionException
106+
* @throws UnknownPropertyTypeException
86107
*/
87108
public function mapFromRequest(FormRequest $request, bool $onlyValidated = true): object
88109
{
89110
$data = $onlyValidated ? $request->validated() : $request->all();
90111

91-
return $this->mapFromArray($data);
112+
return $this->mapData($data, $request);
92113
}
93114
}

src/Property.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class Property
1616
/**
1717
* @param ReflectionProperty $property
1818
*
19-
* @throws ReflectionException
19+
* @throws ReflectionException|Exceptions\UnknownPropertyTypeException
2020
*/
2121
public function __construct(ReflectionProperty $property)
2222
{

tests/Unit/SetterNameTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace Shureban\LaravelObjectMapper\Tests\Unit;
4+
5+
use Shureban\LaravelObjectMapper\Attributes\SetterName;
6+
use Tests\TestCase;
7+
8+
class SetterNameTest extends TestCase
9+
{
10+
public function test_SetterName()
11+
{
12+
$this->assertEquals('setSimple', (string)new SetterName('simple'));
13+
$this->assertEquals('setCamelCaseMethod', (string)new SetterName('camelCaseMethod'));
14+
$this->assertEquals('setSnakeCaseMethod', (string)new SetterName('snake_case_method'));
15+
}
16+
}

tests/Unit/ShouldBe/WithSetterClass.php

Lines changed: 0 additions & 7 deletions
This file was deleted.

tests/Unit/ShouldBe/WithoutTypeClass.php

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Shureban\LaravelObjectMapper\Tests\Unit\Structs;
4+
5+
use Illuminate\Foundation\Http\FormRequest;
6+
7+
class WithSetterClass
8+
{
9+
public string $value;
10+
public string $request_value;
11+
12+
/**
13+
* @param string $value
14+
*/
15+
public function setValue(string $value): void
16+
{
17+
$this->value = sprintf('setter_%s', $value);
18+
}
19+
20+
/**
21+
* @param string $value
22+
* @param FormRequest $request
23+
*/
24+
public function setRequestValue(string $value, FormRequest $request): void
25+
{
26+
$this->request_value = sprintf('setter_%s', $value);
27+
}
28+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Shureban\LaravelObjectMapper\Tests\Unit\Structs;
4+
5+
class WithoutTypeClass
6+
{
7+
public $int;
8+
public $float;
9+
public $string;
10+
public $bool;
11+
public $array;
12+
public $object;
13+
}

0 commit comments

Comments
 (0)