Conversation

janedbal

@janedbaljanedbal force-pushed the smallfloat-descriptor branch from 2082cc3 to 2e8b2b6 Compare April 24, 2025 14:03
path: src/Type/Doctrine/Descriptors/SmallFloatType.php

-
message: '#^Class Doctrine\\DBAL\\Types\\EnumType not found\.$#'
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first, I tried adding new doctrine versions to composer.json, but it would require bigger effort to adjust this repo to support those everywhere, so I just referenced those not-yet-existing classes.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • tests describing what this actually fixes would be nice


namespace PHPStan\Type\Doctrine\Descriptors;

class SmallFloatType extends FloatType
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No inheritance please

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you sure? I believe SmallFloatType IS FloatType in terms of type descriptor.

use PHPStan\Type\StringType;
use PHPStan\Type\Type;

class EnumType implements DoctrineTypeDescriptor
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Am I wrong or without this type the data is considered as mixed ?

Now with this, it will report error foo be 'A'|'B' but is string on level 8 because the values option is not considered in the following code

#[ORM\Column(name: 'foo', type: Types::ENUM, options: ['values' => ['A', 'B'])]

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Am I wrong or without this type the data is considered as mixed ?

You are correct.

@janedbal

tests describing what this actually fixes would be nice

It is pretty painful to test new doctrine here (due to all the compatibility hacks). But added.

@janedbaljanedbal force-pushed the smallfloat-descriptor branch from eca8f6c to a59b33b Compare June 13, 2025 13:06

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The enum type will introduce new false-positive.

Before

/**
   * @Column(type="enum", options={"values"={"a", "b", "c"}})
   * @var 'a'|'b'|'c'
   *
   public $enum;

Was reported level 9 (mixed is not 'a'|'b'|'c')
and now will be reported on a lower level (string is not 'a'|'b'|'c')

Would it be possible to read the options ?

@janedbal

Would it be possible to read the options ?

Yes, implemented.

@VincentLanglet

Would it be possible to read the options ?

Yes, implemented.

Great.

Could add a test for the EntityColumnRule too

class EntityColumnRuleTest extends RuleTestCase

(I assume we just need to add an enum field in the BrokenEntity https://.com/phpstan/phpstan-doctrine/blob/a1a9efb64708580a9d8b0d150340f7777d2b8aa0/tests/Rules/Doctrine/ORM/data/MyBrokenEntity.php)

I assume that

/**
   * @Column(type="enum", options={"values"={"a", "b", "c"}})
   * @var 'a'|'b'|'c'
   *
   public $enum;

shouldn't be reported but

/**
   * @Column(type="enum", options={"values"={"a", "b", "c"}})
   * @var string
   *
   public $enumWithUnprecisedPHPDoc;

should be reported

Sign up for free to join this conversation on . Already have an account? Sign in to comment
None yet
None yet

Successfully merging this pull request may close these issues.

Doctrine DBAL 4.2 ships an Types::ENUM which should be preferred over implementing custom types for ENUM fields.