Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Register custom Doctrine type in Symfony4

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?

like image 709
Nin Avatar asked Apr 15 '18 08:04

Nin


People also ask

What is DBAL Doctrine?

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.

What is Doctrine repository?

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.

What is the use of Doctrine in PHP?

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.


1 Answers

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.

like image 73
Nin Avatar answered Oct 04 '22 09:10

Nin