Zend Expressive + пользовательские типы доктрины

Я пытаюсь сопоставить пользовательский тип со строкой. Вот мое определение сущности:

/**
 * @var string
 * 
 * @ORM\Column(name="type", type="string", columnDefinition="my_type_enum", nullable=false)
 */

Но когда я пытаюсь создать миграцию (миграция: diff), это вывод

[Doctrine\DBAL\DBALException] Запрошен неизвестный тип базы данных my_type_enum, Doctrine\DBAL\Platforms\PostgreSQL92Platform может не поддерживать его.

Кажется, мне нужно сопоставить свой пользовательский тип my_type_enum со строкой, используя mapping_types, но где в Zend Expressive? Кажется, моя конфигурация игнорируется

...
     'doctrine' => [
       'dbal' => [
         'mapping_types' => [
           'my_type_enum' => 'string'
         ]
       ]
     ]
...

person Diego Betto    schedule 22.09.2016    source источник


Ответы (2)


Сам zend-expressive не имеет встроенной поддержки доктрины. Это зависит от модуля доктрины и его фабрики, которую вы используете. Фабрика запускает службу доктрины с файлом config. Поэтому я бы заглянул внутрь фабрики доктрин, чтобы выяснить, как и поддерживает ли она пользовательские типы сопоставления.

Если ваш не поддерживает его, вы можете использовать container-interop-doctrine. Он поддерживает этот встроенный кажется (сам не пробовал):

<?php
return [
    'doctrine' => [
        // ...
        'connection' => [
            'orm_default' => [
                'driver_class' => \Doctrine\DBAL\Driver\PDOMySql\Driver::class,
                'wrapper_class' => null,
                'pdo' => null,
                'configuration' => 'orm_default', 
                'event_manager' => 'orm_default', 
                'params' => [],
                'doctrine_mapping_types' => [], // <-----
                'doctrine_commented_types' => [],
            ],
        ],
        'types' = [
            'typename' => Type::class,
        ], // <-----
    ],
];
person xtreamwayz    schedule 23.09.2016
comment
+1 для github.com/DASPRiD/container-interop-doctrine Мы используем его, и очень нравится. DASPRaD — надежный архитектор и последовательный специалист по сопровождению. - person dualmon; 24.09.2016

Прежде всего, вы должны создать свой пользовательский тип, который расширяет тип доктрины DBAL:

<?php
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\ConversionException;

class MyType extends Type
{
    const MYTYPE = 'mytype';

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {
        return 'mytype';
    }

    public function convertToPHPValue($value, AbstractPlatform $platform) {
        // convert your type to php value
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform) {
        // convert your type to database value
    }
}

Недавно я интегрировал объект-значение в качестве типа доктрины, так что вы можете посмотреть, как должен выглядеть ваш новый тип: PostcodeType

Следующим шагом будет регистрация нового типа, скажем, в вашей доктрине bootstrap или EntityManagerFactory:

<?php // ./src/Container/EntityManagerFactory.php

if (!\Doctrine\DBAL\Types\Type::hasType("mytype")) {
    \Doctrine\DBAL\Types\Type::addType('mytype', 'Your\Namespace\MyType');
    $em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('mytype', 'mytype');
}

return $em;

Наконец, вы зарегистрировали свой новый тип и можете его использовать:

/**
 * @var \Your\Namespace\MyType
 * @Column(type="mytype")
 */
protected $param;
person Vasil Dakov    schedule 21.11.2016