Skip to content

Commit 13fdd84

Browse files
committed
Remove unnecessary nullable type on fields and unidirectional to-one associations
1 parent eb88eae commit 13fdd84

File tree

7 files changed

+172
-7
lines changed

7 files changed

+172
-7
lines changed

src/EntityGenerator/EntityGenerator.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ protected function addEmbedded(GenerateEntityRequest $request, string $fieldName
348348
'reflectionProperty' => $reflectionProperty,
349349
'request' => $request,
350350
'embeddedMapping' => $embeddedMapping,
351+
'helper' => new TwigHelper(),
351352
]);
352353
}
353354

@@ -362,6 +363,7 @@ protected function addEmbedded(GenerateEntityRequest $request, string $fieldName
362363
'reflectionProperty' => $reflectionProperty,
363364
'request' => $request,
364365
'embeddedMapping' => $embeddedMapping,
366+
'helper' => new TwigHelper(),
365367
]);
366368
}
367369
}
@@ -467,6 +469,7 @@ protected function addAssociationToOne(GenerateEntityRequest $request, Associati
467469
'reflectionProperty' => $reflectionProperty,
468470
'request' => $request,
469471
'associationMapping' => $associationMapping,
472+
'helper' => new TwigHelper(),
470473
]);
471474
}
472475

@@ -481,6 +484,7 @@ protected function addAssociationToOne(GenerateEntityRequest $request, Associati
481484
'reflectionProperty' => $reflectionProperty,
482485
'request' => $request,
483486
'associationMapping' => $associationMapping,
487+
'helper' => new TwigHelper(),
484488
]);
485489
}
486490
}
@@ -513,6 +517,7 @@ protected function addAssociationToMany(GenerateEntityRequest $request, Associat
513517
'request' => $request,
514518
'associationMapping' => $associationMapping,
515519
'collectionAlias' => $collectionAlias,
520+
'helper' => new TwigHelper(),
516521
]);
517522
}
518523

@@ -530,6 +535,7 @@ protected function addAssociationToMany(GenerateEntityRequest $request, Associat
530535
'request' => $request,
531536
'associationMapping' => $associationMapping,
532537
'collectionAlias' => $collectionAlias,
538+
'helper' => new TwigHelper(),
533539
]);
534540
}
535541

@@ -545,6 +551,7 @@ protected function addAssociationToMany(GenerateEntityRequest $request, Associat
545551
'request' => $request,
546552
'associationMapping' => $associationMapping,
547553
'collectionAlias' => $collectionAlias,
554+
'helper' => new TwigHelper(),
548555
]);
549556
}
550557

@@ -558,6 +565,7 @@ protected function addAssociationToMany(GenerateEntityRequest $request, Associat
558565
'associationMapping' => $associationMapping,
559566
'collectionAlias' => $collectionAlias,
560567
'collectionAliasInConstructor' => $collectionAliasInConstructor,
568+
'helper' => new TwigHelper(),
561569
]);
562570
}
563571

src/EntityGenerator/Util/TwigHelper.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,11 @@ public function is(?object $value, string $class): bool
2222
{
2323
return $value instanceof $class;
2424
}
25+
26+
public function isNullable(\ReflectionProperty $reflectionProperty): bool
27+
{
28+
$type = $reflectionProperty->getType();
29+
30+
return null === $type || $type->allowsNull();
31+
}
2532
}

templates/Theme/base.php.twig

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
{% if hintParts|length > 1 %}
6161
{{ hintParts|join('|') }}|null
6262
{% else %}
63-
?{{ hintParts|join('|') }}
63+
{{ helper.isNullable(reflectionProperty) ? '?' : '' }}{{ hintParts|join('|') }}
6464
{% endif %}
6565
{% endif %}
6666
{% endblock %}
@@ -85,14 +85,14 @@
8585
{# Enum #}
8686

8787
{% block enum_get %}
88-
public function {{ methodName }}(): ?{{ enumAlias }}
88+
public function {{ methodName }}(): {{ helper.isNullable(reflectionProperty) ? '?' : '' }}{{ enumAlias }}
8989
{
9090
return $this->{{ fieldName }};
9191
}
9292
{% endblock %}
9393

9494
{% block enum_set %}
95-
public function {{ methodName }}(?{{ enumAlias }} ${{ variableName }}): self
95+
public function {{ methodName }}({{ helper.isNullable(reflectionProperty) ? '?' : '' }}{{ enumAlias }} ${{ variableName }}): self
9696
{
9797
$this->{{ fieldName }} = ${{ variableName }};
9898

@@ -103,14 +103,14 @@
103103
{# Embedded #}
104104

105105
{% block embedded_get %}
106-
public function {{ methodName }}(): ?{{ targetClassAlias }}
106+
public function {{ methodName }}(): {{ helper.isNullable(reflectionProperty) ? '?' : '' }}{{ targetClassAlias }}
107107
{
108108
return $this->{{ fieldName }};
109109
}
110110
{% endblock %}
111111

112112
{% block embedded_set %}
113-
public function {{ methodName }}(?{{ targetClassAlias }} ${{ variableName }}): self
113+
public function {{ methodName }}({{ helper.isNullable(reflectionProperty) ? '?' : '' }}{{ targetClassAlias }} ${{ variableName }}): self
114114
{
115115
$this->{{ fieldName }} = ${{ variableName }};
116116

@@ -121,14 +121,14 @@
121121
{# Associations To One #}
122122

123123
{% block assocation_to_one_get %}
124-
public function {{ methodName }}(): ?{{ targetEntityAlias }}
124+
public function {{ methodName }}(): {{ helper.isNullable(reflectionProperty) ? '?' : '' }}{{ targetEntityAlias }}
125125
{
126126
return $this->{{ fieldName }};
127127
}
128128
{% endblock %}
129129

130130
{% block assocation_one_to_one_unidirectional_set %}
131-
public function {{ methodName }}(?{{ targetEntityAlias }} ${{ variableName }}): self
131+
public function {{ methodName }}({{ helper.isNullable(reflectionProperty) ? '?' : '' }}{{ targetEntityAlias }} ${{ variableName }}): self
132132
{
133133
$this->{{ fieldName }} = ${{ variableName }};
134134

tests/App/Entity/WithNotNull.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* This file is part of the EcommitDoctrineEntitiesGeneratorBundle package.
7+
*
8+
* (c) E-commit <contact@e-commit.fr>
9+
*
10+
* For the full copyright and license information, please view the LICENSE
11+
* file that was distributed with this source code.
12+
*/
13+
14+
namespace Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity;
15+
16+
use Doctrine\ORM\Mapping as ORM;
17+
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\Foo\Foo;
18+
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Sub\EnumInt;
19+
20+
#[ORM\Entity]
21+
#[ORM\Table(name: 'with_not_null')]
22+
class WithNotNull
23+
{
24+
#[ORM\Id]
25+
#[ORM\GeneratedValue]
26+
#[ORM\Column(type: 'integer', name: 'id')]
27+
protected int $id;
28+
29+
#[ORM\Column(type: 'string', length: 255)]
30+
protected string $string;
31+
32+
#[ORM\Column(type: 'integer', enumType: EnumInt::class)]
33+
protected EnumInt $enumInt;
34+
35+
#[ORM\Embedded(class: 'Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\Address')]
36+
protected Address $address;
37+
38+
#[ORM\OneToOne(targetEntity: 'Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\Foo\Foo')]
39+
#[ORM\JoinColumn(name: 'foo_id', referencedColumnName: 'foo_id', nullable: true)]
40+
protected Foo $toOneUnidirectional;
41+
42+
/*
43+
* Getters / Setters (auto-generated)
44+
*/
45+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* This file is part of the EcommitDoctrineEntitiesGeneratorBundle package.
7+
*
8+
* (c) E-commit <contact@e-commit.fr>
9+
*
10+
* For the full copyright and license information, please view the LICENSE
11+
* file that was distributed with this source code.
12+
*/
13+
14+
namespace Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\GeneratedEntity;
15+
16+
use Doctrine\ORM\Mapping as ORM;
17+
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\GeneratedEntity\Foo\Foo;
18+
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Sub\EnumInt;
19+
20+
#[ORM\Entity]
21+
#[ORM\Table(name: 'with_not_null')]
22+
class WithNotNull
23+
{
24+
#[ORM\Id]
25+
#[ORM\GeneratedValue]
26+
#[ORM\Column(type: 'integer', name: 'id')]
27+
protected int $id;
28+
29+
#[ORM\Column(type: 'string', length: 255)]
30+
protected string $string;
31+
32+
#[ORM\Column(type: 'integer', enumType: EnumInt::class)]
33+
protected EnumInt $enumInt;
34+
35+
#[ORM\Embedded(class: 'Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\GeneratedEntity\Address')]
36+
protected Address $address;
37+
38+
#[ORM\OneToOne(targetEntity: 'Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\GeneratedEntity\Foo\Foo')]
39+
#[ORM\JoinColumn(name: 'foo_id', referencedColumnName: 'foo_id', nullable: true)]
40+
protected Foo $toOneUnidirectional;
41+
42+
/*
43+
* Getters / Setters (auto-generated)
44+
*/
45+
46+
public function getId(): int
47+
{
48+
return $this->id;
49+
}
50+
51+
public function setString(string $string): self
52+
{
53+
$this->string = $string;
54+
55+
return $this;
56+
}
57+
58+
public function getString(): string
59+
{
60+
return $this->string;
61+
}
62+
63+
public function setEnumInt(EnumInt $enumInt): self
64+
{
65+
$this->enumInt = $enumInt;
66+
67+
return $this;
68+
}
69+
70+
public function getEnumInt(): EnumInt
71+
{
72+
return $this->enumInt;
73+
}
74+
75+
public function setToOneUnidirectional(Foo $toOneUnidirectional): self
76+
{
77+
$this->toOneUnidirectional = $toOneUnidirectional;
78+
79+
return $this;
80+
}
81+
82+
public function getToOneUnidirectional(): Foo
83+
{
84+
return $this->toOneUnidirectional;
85+
}
86+
87+
public function setAddress(Address $address): self
88+
{
89+
$this->address = $address;
90+
91+
return $this;
92+
}
93+
94+
public function getAddress(): Address
95+
{
96+
return $this->address;
97+
}
98+
}

tests/EntityGenerator/EntityGeneratorTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\Sale;
4545
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\SubClass;
4646
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\WithEnum;
47+
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\WithNotNull;
4748
use Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor;
4849
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
4950
use Twig\Environment;
@@ -417,6 +418,7 @@ public static function getTestGenerateProvider(): array
417418
[Foo::class],
418419
[Bar::class],
419420
[WithEnum::class],
421+
[WithNotNull::class],
420422
];
421423

422424
return $data;

tests/EntitySearcher/EntitySearcherTest.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\Sale;
3535
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\SubClass;
3636
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\WithEnum;
37+
use Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\WithNotNull;
3738
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
3839
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
3940

@@ -162,6 +163,7 @@ public static function getTestClassCanBeGeneratedProvider(): array
162163
[Sale::class, true],
163164
[SubClass::class, true],
164165
[WithEnum::class, true],
166+
[WithNotNull::class, true],
165167
];
166168
}
167169

@@ -233,6 +235,7 @@ public static function getTestProvider(): array
233235
Sale::class,
234236
SubClass::class,
235237
WithEnum::class,
238+
WithNotNull::class,
236239
]];
237240

238241
$data[] = ['Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\*', [
@@ -254,6 +257,7 @@ public static function getTestProvider(): array
254257
Sale::class,
255258
SubClass::class,
256259
WithEnum::class,
260+
WithNotNull::class,
257261
]];
258262

259263
$data[] = ['Ecommit/DoctrineEntitiesGeneratorBundle/Tests/App/Entity/*', [
@@ -275,6 +279,7 @@ public static function getTestProvider(): array
275279
Sale::class,
276280
SubClass::class,
277281
WithEnum::class,
282+
WithNotNull::class,
278283
]];
279284

280285
return $data;

0 commit comments

Comments
 (0)