Skip to content

Commit 5eaf37b

Browse files
Fix BinaryType with dbal 4
1 parent 4a761b6 commit 5eaf37b

File tree

3 files changed

+91
-1
lines changed

3 files changed

+91
-1
lines changed

src/Type/Doctrine/Descriptors/BinaryType.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
namespace PHPStan\Type\Doctrine\Descriptors;
44

5+
use Composer\InstalledVersions;
56
use PHPStan\Type\MixedType;
67
use PHPStan\Type\ResourceType;
78
use PHPStan\Type\StringType;
89
use PHPStan\Type\Type;
10+
use function class_exists;
11+
use function strpos;
912

1013
class BinaryType implements DoctrineTypeDescriptor
1114
{
@@ -17,6 +20,10 @@ public function getType(): string
1720

1821
public function getWritableToPropertyType(): Type
1922
{
23+
if ($this->hasDbal4()) {
24+
return new StringType();
25+
}
26+
2027
return new ResourceType();
2128
}
2229

@@ -30,4 +37,18 @@ public function getDatabaseInternalType(): Type
3037
return new StringType();
3138
}
3239

40+
private function hasDbal4(): bool
41+
{
42+
if (!class_exists(InstalledVersions::class)) {
43+
return false;
44+
}
45+
46+
$dbalVersion = InstalledVersions::getVersion('doctrine/dbal');
47+
if ($dbalVersion === null) {
48+
return false;
49+
}
50+
51+
return strpos($dbalVersion, '4.') === 0;
52+
}
53+
3354
}

tests/Rules/Doctrine/ORM/EntityColumnRuleTest.php

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
use PHPStan\Type\Doctrine\ObjectMetadataResolver;
3131
use function array_unshift;
3232
use function class_exists;
33+
use function sprintf;
3334
use function strpos;
3435
use const PHP_VERSION_ID;
3536

@@ -292,9 +293,16 @@ public function testSuperclass(?string $objectManagerLoader): void
292293
{
293294
$this->allowNullablePropertyForRequiredField = false;
294295
$this->objectManagerLoader = $objectManagerLoader;
296+
297+
$dbalVersion = InstalledVersions::getVersion('doctrine/dbal');
298+
$hasDbal4 = $dbalVersion !== null && strpos($dbalVersion, '4.') === 0;
299+
295300
$this->analyse([__DIR__ . '/data/MyBrokenSuperclass.php'], [
296301
[
297-
'Property PHPStan\Rules\Doctrine\ORM\MyBrokenSuperclass::$five type mapping mismatch: database can contain resource but property expects int.',
302+
sprintf(
303+
'Property PHPStan\Rules\Doctrine\ORM\MyBrokenSuperclass::$five type mapping mismatch: database can contain %s but property expects int.',
304+
$hasDbal4 ? 'string' : 'resource',
305+
),
298306
17,
299307
],
300308
]);
@@ -537,4 +545,33 @@ public function testBugSingleEnum(?string $objectManagerLoader): void
537545
$this->analyse([__DIR__ . '/data/bug-single-enum.php'], []);
538546
}
539547

548+
/**
549+
* @dataProvider dataObjectManagerLoader
550+
*/
551+
public function testBug659(?string $objectManagerLoader): void
552+
{
553+
$this->allowNullablePropertyForRequiredField = false;
554+
$this->objectManagerLoader = $objectManagerLoader;
555+
556+
$dbalVersion = InstalledVersions::getVersion('doctrine/dbal');
557+
$hasDbal4 = $dbalVersion !== null && strpos($dbalVersion, '4.') === 0;
558+
if ($hasDbal4) {
559+
$errors = [
560+
[
561+
'Property PHPStan\Rules\Doctrine\ORM\MyEntity659::$binaryResource type mapping mismatch: database can contain string but property expects resource.',
562+
31,
563+
],
564+
];
565+
} else {
566+
$errors = [
567+
[
568+
'Property PHPStan\Rules\Doctrine\ORM\MyEntity659::$binaryString type mapping mismatch: database can contain resource but property expects string.',
569+
25,
570+
],
571+
];
572+
}
573+
574+
$this->analyse([__DIR__ . '/data/bug-659.php'], $errors);
575+
}
576+
540577
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php // lint >= 8.0
2+
3+
namespace PHPStan\Rules\Doctrine\ORM;
4+
5+
use Doctrine\ORM\Mapping as ORM;
6+
7+
/**
8+
* @ORM\Entity()
9+
*/
10+
class MyEntity659
11+
{
12+
13+
/**
14+
* @ORM\Id()
15+
* @ORM\GeneratedValue()
16+
* @ORM\Column(type="integer")
17+
* @var int
18+
*/
19+
private $id;
20+
21+
/**
22+
* @var string
23+
* @ORM\Column(type="binary")
24+
*/
25+
private $binaryString;
26+
27+
/**
28+
* @var resource
29+
* @ORM\Column(type="binary")
30+
*/
31+
private $binaryResource;
32+
}

0 commit comments

Comments
 (0)