Skip to content

Commit 39922cb

Browse files
committed
[DTO-15] Immutable transfer objects
1 parent e756e17 commit 39922cb

File tree

7 files changed

+124
-2
lines changed

7 files changed

+124
-2
lines changed

src/DefinitionProvider.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,17 @@ public function provide(): array
3232

3333
$transfers = [];
3434
foreach ($definitions as $definition) {
35+
$isImmutable = $definition['immutable'] ?? false;
36+
$className = $isImmutable ? $definition['name'] . 'TransferImmutable' : $definition['name'] . 'Transfer';
3537
$useNamespaces = [
3638
'Tlab\TransferObjects\AbstractTransfer'
3739
];
3840
$classTransfer = [
3941
'namespace' => $this->namespace,
40-
'className' => $definition['name'] . 'Transfer',
42+
'className' => $className,
4143
'abstractClass' => 'AbstractTransfer',
4244
'deprecationDescription' => $definition['deprecationDescription'] ?? null,
45+
'immutable' => $isImmutable,
4346
];
4447

4548
$classProperties = [];

src/Schema/schema.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
"type": "string",
1717
"description": "Class deprecation description"
1818
},
19+
"immutable": {
20+
"type": "boolean",
21+
"description": "Class without setters"
22+
},
1923
"properties": {
2024
"type": "array",
2125
"items": {

src/Templates/class.twig

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ class {{ className }} extends {{ abstractClass }}
2424
{% for property in properties %}
2525
{{ macro.getMethodDocBlock(property) }}
2626
{{ macro.getMethod(property) }}
27+
{% if immutable == false %}
2728
{{ macro.setMethodDocBlock(property) }}
2829
{{ macro.setMethod(property) }}
29-
{% if property.type == 'array' %}
30+
{% endif %}
31+
{% if immutable == false and property.type == 'array' %}
3032
{{ macro.arrayAddMethodDocBlock(property) }}
3133
{{ macro.arrayAddMethod(property) }}
3234
{% endif %}

tests/Data/immutable-sample.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"transfers": [
3+
{
4+
"name": "Bicycle",
5+
"immutable":true,
6+
"properties": [
7+
{
8+
"name": "brand",
9+
"type": "string"
10+
},
11+
{
12+
"name": "size",
13+
"type": "string"
14+
},
15+
{
16+
"name": "price",
17+
"type": "float"
18+
}
19+
]
20+
}
21+
]
22+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespace Tlab\Tests\Generated;
4+
5+
use Tlab\TransferObjects\AbstractTransfer;
6+
7+
/**
8+
* !!! THIS TRANSFER CLASS FILE IS AUTO-GENERATED, CHANGES WILL BREAK YOUR PROJECT
9+
* !!! DO NOT CHANGE ANYTHING IN THIS FILE
10+
*/
11+
class BicycleTransferImmutable extends AbstractTransfer
12+
{
13+
/**
14+
* @var string
15+
*/
16+
private string $brand;
17+
18+
/**
19+
* @var string
20+
*/
21+
private string $size;
22+
23+
/**
24+
* @var float
25+
*/
26+
private float $price;
27+
28+
/**
29+
* @return string
30+
*/
31+
public function getBrand(): string
32+
{
33+
return $this->brand;
34+
}
35+
36+
/**
37+
* @return string
38+
*/
39+
public function getSize(): string
40+
{
41+
return $this->size;
42+
}
43+
44+
/**
45+
* @return float
46+
*/
47+
public function getPrice(): float
48+
{
49+
return $this->price;
50+
}
51+
52+
}

tests/Unit/DataTransferBuilderTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public function testBuildTransfer(): void
4545
self::assertFileEquals($expectedFiles[5], $generatedFiles[5]);
4646
self::assertFileEquals($expectedFiles[6], $generatedFiles[6]);
4747
self::assertFileEquals($expectedFiles[7], $generatedFiles[7]);
48+
self::assertFileEquals($expectedFiles[8], $generatedFiles[8]);
4849
}
4950

5051
public function testCanExportTransferClassToArray(): void

tests/Unit/DefinitionProviderTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public function testProvide(): void
2222
'Tlab\TransferObjects\AbstractTransfer',
2323
],
2424
'deprecationDescription' => null,
25+
'immutable' => false,
2526
'properties' => [
2627
[
2728
'type' => 'string',
@@ -64,6 +65,7 @@ public function testProvide(): void
6465
'Tlab\TransferObjects\AbstractTransfer',
6566
],
6667
'deprecationDescription' => 'This class is deprecated',
68+
'immutable' => false,
6769
'properties' => [
6870
[
6971
'type' => 'int',
@@ -101,6 +103,7 @@ public function testProvide(): void
101103
'Tlab\TransferObjects\AbstractTransfer',
102104
],
103105
'deprecationDescription' => null,
106+
'immutable' => false,
104107
'properties' => [
105108
[
106109
'type' => 'int',
@@ -130,6 +133,36 @@ public function testProvide(): void
130133
],
131134
]
132135
],
136+
[
137+
'namespace' => 'TestNamespace',
138+
'className' => 'BicycleTransferImmutable',
139+
'abstractClass' => 'AbstractTransfer',
140+
'useNamespaces' => [
141+
'Tlab\TransferObjects\AbstractTransfer',
142+
],
143+
'deprecationDescription' => null,
144+
'immutable' => true,
145+
'properties' => [
146+
[
147+
'type' => 'string',
148+
'camelCaseName' => 'brand',
149+
'nullable' => false,
150+
'deprecationDescription' => null,
151+
],
152+
[
153+
'type' => 'string',
154+
'camelCaseName' => 'size',
155+
'nullable' => false,
156+
'deprecationDescription' => null,
157+
],
158+
[
159+
'type' => 'float',
160+
'camelCaseName' => 'price',
161+
'nullable' => false,
162+
'deprecationDescription' => null,
163+
],
164+
]
165+
],
133166
[
134167
'namespace' => 'TestNamespace',
135168
'className' => 'OrderTransfer',
@@ -139,6 +172,7 @@ public function testProvide(): void
139172
'Tlab\TransferObjects\AbstractTransfer',
140173
],
141174
'deprecationDescription' => null,
175+
'immutable' => false,
142176
'properties' => [
143177
[
144178
'type' => 'int',
@@ -185,6 +219,7 @@ public function testProvide(): void
185219
'Tlab\TransferObjects\AbstractTransfer',
186220
],
187221
'deprecationDescription' => null,
222+
'immutable' => false,
188223
'properties' => [
189224
[
190225
'type' => 'int',
@@ -220,6 +255,7 @@ public function testProvide(): void
220255
'className' => 'ProductTransfer',
221256
'abstractClass' => 'AbstractTransfer',
222257
'deprecationDescription' => null,
258+
'immutable' => false,
223259
'properties' => [
224260
[
225261
'type' => 'string',
@@ -266,6 +302,7 @@ public function testProvide(): void
266302
],
267303
'abstractClass' => 'AbstractTransfer',
268304
'deprecationDescription' => null,
305+
'immutable' => false,
269306
'properties' => [
270307
[
271308
'type' => 'string',
@@ -284,6 +321,7 @@ public function testProvide(): void
284321
'Symfony\Component\HttpFoundation\Response',
285322
'Tlab\TransferObjects\AbstractTransfer'
286323
],
324+
'immutable' => false,
287325
'properties' => [
288326
[
289327
'type' => 'Response',

0 commit comments

Comments
 (0)