So I have this custom Doctrine type
namespace App\Doctrine\Types;
use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\TextType;
class MyType extends TextType
{
private $prefix='';
public function getName()
{
return 'my_type';
}
public function setPrefix(string $prefix)
{
$this->prefix=$prefix;
}
}
I registerd in in the config/packages/doctrine.yml:
doctrine:
dbal:
types:
my_type: App\Doctrine\Types\MyType
Then in Kernel boot() I'm trying to add some parameters to this type:
public function boot() {
parent::boot();
$myType=Type::getType('my_type');
$myType->setPrefix('abc');
}
This works perfectly the first time I run the app. The prefix is set for the type and can be used through the whole app. However, the second time I get an Exception:
Unknown column type "encrypted_text" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType(). You can get a list of all the known types with \Doctrine\DBAL\Types\Type::getTypesMap(). If this error occurs during database introspection then you might have forgotten to register all database types for a Doctrine Type. Use AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement Type#getMappedDatabaseTypes(). If the type name is empty you might have a problem with the cache or forgot some mapping information.
I then changed boot() to :
public function boot() {
parent::boot();
if (!Type::hasType('my_type')) {
Type::addType('my_type', 'App\Doctrine\Types\MyType');
}
$myType=Type::getType('my_type');
$myType->setPrefix('abc');
}
Now the exception is gone, but the prefix is not set. I know the exceptions gives me information about what to do but I really don't know where to start.
Can anyone point me in the right direction?
The Doctrine Database Abstraction Layer (DBAL) is an abstraction layer that sits on top of PDO and offers an intuitive and flexible API for communicating with the most popular relational databases.
A repository in a term used by many ORMs (Object Relational Mappers), doctrine is just one of these. It means the place where our data can be accessed from, a repository of data. This is to distinguish it from a database as a repository does not care how its data is stored.
The purpose of the Doctrine project is to build an equally powerful solution for the PHP language for high-load websites that have to maintain a constant flow of visitors. Doctrine ORM can be used to improve the performance of such websites.
For now I fixed it by removing it from config/packages/doctrine.yml so it's not registered there anymore. In Kernel I can now load it:
public function boot() {
parent::boot();
if (!Type::hasType('my_type')) {
Type::addType('my_type', 'App\Doctrine\Types\MyType');
}
$myType = Type::getType('my_type');
$myType->setPrefix('abc');
}
I still can't really understand why this works before building the cache but not once the cache is build. But well, I can continue now.
If someone has a better answer, I'd be more than happy to accept it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With