Skip to content

Commit 2fcdf95

Browse files
feat: improve accidental misconfiguration through the use of constants for all DBAL types (#486)
Co-authored-by: Martin Georgiev <martin-georgiev@users.noreply.github.com>
1 parent c2fd34d commit 2fcdf95

31 files changed

+154
-43
lines changed

README.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,23 @@ Enhances Doctrine with PostgreSQL-specific features and functions. Supports Post
99

1010
## Quick Start
1111

12+
1213
```php
14+
use MartinGeorgiev\Doctrine\DBAL\Type;
15+
1316
// Register types with Doctrine
14-
Type::addType('jsonb', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\Jsonb");
15-
Type::addType('text[]', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\TextArray");
16-
Type::addType('numrange', "MartinGeorgiev\\Doctrine\\DBAL\\Types\\NumRange");
17+
Type::addType(Type::JSONB, "MartinGeorgiev\\Doctrine\\DBAL\\Types\\Jsonb");
18+
Type::addType(Type::TEXT_ARRAY, "MartinGeorgiev\\Doctrine\\DBAL\\Types\\TextArray");
19+
Type::addType(Type::NUMRANGE, "MartinGeorgiev\\Doctrine\\DBAL\\Types\\NumRange");
1720

1821
// Use in your Doctrine entities
19-
#[ORM\Column(type: 'jsonb')]
22+
#[ORM\Column(type: Type::JSONB)]
2023
private array $data;
2124

22-
#[ORM\Column(type: 'text[]')]
25+
#[ORM\Column(type: Type::TEXT_ARRAY)]
2326
private array $tags;
2427

25-
#[ORM\Column(type: 'numrange')]
28+
#[ORM\Column(type: Type::NUMRANGE)]
2629
private NumericRange $priceRange;
2730

2831
// Use in DQL

docs/INTEGRATING-WITH-SYMFONY.md

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ Once configured, you can use the PostgreSQL types in your Symfony entities:
301301
namespace App\Entity;
302302
303303
use Doctrine\ORM\Mapping as ORM;
304+
use MartinGeorgiev\Doctrine\DBAL\Type;
304305
use MartinGeorgiev\Doctrine\DBAL\Types\ValueObject\DateRange;
305306
use MartinGeorgiev\Doctrine\DBAL\Types\ValueObject\Ltree;
306307
use MartinGeorgiev\Doctrine\DBAL\Types\ValueObject\NumericRange;
@@ -316,25 +317,25 @@ class Product
316317
#[ORM\Column]
317318
private ?int $id = null;
318319
319-
#[ORM\Column(type: 'jsonb')]
320+
#[ORM\Column(type: Type::JSONB)]
320321
private array $specifications = [];
321322
322-
#[ORM\Column(type: 'text[]')]
323+
#[ORM\Column(type: Type::TEXT_ARRAY)]
323324
private array $categories = [];
324325
325-
#[ORM\Column(type: 'point')]
326+
#[ORM\Column(type: Type::POINT)]
326327
private Point $manufacturingLocation;
327328
328-
#[ORM\Column(type: 'numrange')]
329+
#[ORM\Column(type: Type::NUMRANGE)]
329330
private NumericRange $priceRange;
330331
331-
#[ORM\Column(type: 'daterange')]
332+
#[ORM\Column(type: Type::DATERANGE)]
332333
private DateRange $availabilityPeriod;
333334
334-
#[ORM\Column(type: 'inet')]
335+
#[ORM\Column(type: Type::INET)]
335336
private string $originServerIp;
336337
337-
#[ORM\Column(type: 'ltree')]
338+
#[ORM\Column(type: Type::LTREE)]
338339
private Ltree $pathFromRoot;
339340
}
340341
```
@@ -377,15 +378,17 @@ If you need to register types programmatically (e.g., in a bundle), you can do s
377378
namespace App\Service;
378379
379380
use Doctrine\DBAL\Types\Type;
381+
use MartinGeorgiev\Doctrine\DBAL\Type;
382+
use MartinGeorgiev\Doctrine\DBAL\Types\Jsonb;
380383
use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
381384
382385
#[Autoconfigure(lazy: true)]
383386
class DoctrineTypeRegistrar
384387
{
385388
public function registerTypes(): void
386389
{
387-
if (!Type::hasType('jsonb')) {
388-
Type::addType('jsonb', \MartinGeorgiev\Doctrine\DBAL\Types\Jsonb::class);
390+
if (!Type::hasType(Type::JSONB)) {
391+
Type::addType(Type::JSONB, Jsonb::class);
389392
}
390393
391394
// Register other types as needed...
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\DBAL;
6+
7+
final class Type
8+
{
9+
// Array Types
10+
public const BIGINT_ARRAY = 'bigint[]';
11+
12+
public const BOOL_ARRAY = 'bool[]';
13+
14+
public const CIDR_ARRAY = 'cidr[]';
15+
16+
public const DOUBLE_PRECISION_ARRAY = 'double precision[]';
17+
18+
public const GEOGRAPHY_ARRAY = 'geography[]';
19+
20+
public const GEOMETRY_ARRAY = 'geometry[]';
21+
22+
public const INET_ARRAY = 'inet[]';
23+
24+
public const INTEGER_ARRAY = 'integer[]';
25+
26+
public const JSONB_ARRAY = 'jsonb[]';
27+
28+
public const MACADDR_ARRAY = 'macaddr[]';
29+
30+
public const POINT_ARRAY = 'point[]';
31+
32+
public const REAL_ARRAY = 'real[]';
33+
34+
public const SMALLINT_ARRAY = 'smallint[]';
35+
36+
public const TEXT_ARRAY = 'text[]';
37+
38+
// Scalar Types
39+
public const CIDR = 'cidr';
40+
41+
public const GEOGRAPHY = 'geography';
42+
43+
public const GEOMETRY = 'geometry';
44+
45+
public const INET = 'inet';
46+
47+
public const JSONB = 'jsonb';
48+
49+
public const LTREE = 'ltree';
50+
51+
public const MACADDR = 'macaddr';
52+
53+
public const POINT = 'point';
54+
55+
// Range Types
56+
public const DATERANGE = 'daterange';
57+
58+
public const INT4RANGE = 'int4range';
59+
60+
public const INT8RANGE = 'int8range';
61+
62+
public const NUMRANGE = 'numrange';
63+
64+
public const TSRANGE = 'tsrange';
65+
66+
public const TSTZRANGE = 'tstzrange';
67+
68+
private function __construct()
69+
{
70+
// Prevent instantiation
71+
}
72+
}

src/MartinGeorgiev/Doctrine/DBAL/Types/BigIntArray.php

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

55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

7+
use MartinGeorgiev\Doctrine\DBAL\Type;
8+
79
/**
810
* Implementation of PostgreSQL BIGINT[] data type.
911
*
@@ -17,7 +19,7 @@ class BigIntArray extends BaseIntegerArray
1719
/**
1820
* @var string
1921
*/
20-
protected const TYPE_NAME = 'bigint[]';
22+
protected const TYPE_NAME = Type::BIGINT_ARRAY;
2123

2224
protected function getMinValue(): int
2325
{

src/MartinGeorgiev/Doctrine/DBAL/Types/BooleanArray.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

77
use Doctrine\DBAL\Platforms\AbstractPlatform;
8+
use MartinGeorgiev\Doctrine\DBAL\Type;
89

910
/**
1011
* Implementation of PostgreSQL BOOL[] data type.
@@ -19,7 +20,7 @@ class BooleanArray extends BaseArray
1920
/**
2021
* @var string
2122
*/
22-
protected const TYPE_NAME = 'bool[]';
23+
protected const TYPE_NAME = Type::BOOL_ARRAY;
2324

2425
public function convertToDatabaseValue($phpArray, AbstractPlatform $platform): ?string
2526
{

src/MartinGeorgiev/Doctrine/DBAL/Types/Cidr.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

77
use Doctrine\DBAL\Platforms\AbstractPlatform;
8+
use MartinGeorgiev\Doctrine\DBAL\Type;
89
use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidCidrForDatabaseException;
910
use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidCidrForPHPException;
1011
use MartinGeorgiev\Doctrine\DBAL\Types\Traits\CidrValidationTrait;
@@ -21,7 +22,7 @@ class Cidr extends BaseType
2122
{
2223
use CidrValidationTrait;
2324

24-
protected const TYPE_NAME = 'cidr';
25+
protected const TYPE_NAME = Type::CIDR;
2526

2627
public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string
2728
{

src/MartinGeorgiev/Doctrine/DBAL/Types/CidrArray.php

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

55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

7+
use MartinGeorgiev\Doctrine\DBAL\Type;
78
use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidCidrArrayItemForPHPException;
89
use MartinGeorgiev\Doctrine\DBAL\Types\Traits\CidrValidationTrait;
910

@@ -19,7 +20,7 @@ class CidrArray extends BaseNetworkTypeArray
1920
{
2021
use CidrValidationTrait;
2122

22-
protected const TYPE_NAME = 'cidr[]';
23+
protected const TYPE_NAME = Type::CIDR_ARRAY;
2324

2425
protected function isValidNetworkAddress(string $value): bool
2526
{

src/MartinGeorgiev/Doctrine/DBAL/Types/DateRange.php

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

55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

7+
use MartinGeorgiev\Doctrine\DBAL\Type;
78
use MartinGeorgiev\Doctrine\DBAL\Types\ValueObject\DateRange as DateRangeValueObject;
89
use MartinGeorgiev\Doctrine\DBAL\Types\ValueObject\Range;
910

@@ -18,7 +19,7 @@
1819
*/
1920
class DateRange extends BaseRangeType
2021
{
21-
protected const TYPE_NAME = 'daterange';
22+
protected const TYPE_NAME = Type::DATERANGE;
2223

2324
protected function createFromString(string $value): Range
2425
{

src/MartinGeorgiev/Doctrine/DBAL/Types/DoublePrecisionArray.php

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

55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

7+
use MartinGeorgiev\Doctrine\DBAL\Type;
8+
79
/**
810
* Implementation of PostgreSQL DOUBLE PRECISION[] data type.
911
*
@@ -14,7 +16,7 @@
1416
*/
1517
class DoublePrecisionArray extends BaseFloatArray
1618
{
17-
protected const TYPE_NAME = 'double precision[]';
19+
protected const TYPE_NAME = Type::DOUBLE_PRECISION_ARRAY;
1820

1921
protected function getMinValue(): string
2022
{

src/MartinGeorgiev/Doctrine/DBAL/Types/Geography.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

77
use Doctrine\DBAL\Platforms\AbstractPlatform;
8+
use MartinGeorgiev\Doctrine\DBAL\Type;
89
use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidGeographyForDatabaseException;
910
use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidGeographyForPHPException;
1011
use MartinGeorgiev\Doctrine\DBAL\Types\ValueObject\Exceptions\InvalidWktSpatialDataException;
@@ -20,7 +21,7 @@
2021
*/
2122
final class Geography extends BaseSpatialType
2223
{
23-
protected const TYPE_NAME = 'geography';
24+
protected const TYPE_NAME = Type::GEOGRAPHY;
2425

2526
public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string
2627
{

0 commit comments

Comments
 (0)