-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Open
Description
When a database type is named using the word 'Type', it will get removed and cause the following error:
Error: Class 'MyAppBundle\Type\TypeAccount' not found
/Users/dohpaz42/Development/MyApp/src/MyAppBundle/Type/TypeAccountType.php:18
/Users/dohpaz42/Development/MyApp/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php:128
/Users/dohpaz42/Development/MyApp/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php:69
/Users/dohpaz42/Development/MyApp/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:147
/Users/dohpaz42/Development/MyApp/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:888
/Users/dohpaz42/Development/MyApp/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:181
/Users/dohpaz42/Development/MyApp/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:164
/Users/dohpaz42/Development/MyApp/tests/MyAppBundle/Entity/AccountTest.php:29
The following defines my type in code. I've found that if I do not return an instance of the type from convertToPHPValue I do not get the error.
Doctrine config
# Doctrine Configuration
doctrine:
dbal:
driver: pdo_pgsql
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
types:
currency: MyAppBundle\Type\CurrencyType
type_tx: MyAppBundle\Type\TypeTransactionType
acct_equation: MyAppBundle\Type\AccountEquationType
type_acct: MyAppBundle\Type\TypeAccountType
datetimetz: Doctrine\DBAL\Types\VarDateTimeType
MyAppBundle\Type\TypeAccountType
<?php
namespace MyAppBundle\Type;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class TypeAccountType extends Type
{
const TYPE_ACCOUNT = 'type_acct';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return $this::TYPE_ACCOUNT;
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return new TypeAccount($value);
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return $value->toTypeAccount();
}
public function getName()
{
return $this::TYPE_ACCOUNT;
}
}
I've tracked the error down to Doctrine\DBAL\Types\Type::__toString() in that it blindly removes any instance of the word Type from the class name, when in fact the intent is to remove the last instance of the word Type. Since my class is TypeAccountType, it is being turned into Account, which does not exist and causes the error to be thrown.
Doctrine\DBAL\Types\Type
/**
* @return string
*/
public function __toString()
{
$e = explode('\\', get_class($this));
return str_replace('Type', '', end($e));
}
I am willing to make a unit test and a PR, but wanted to document and get feedback first.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels