Zend Expressive + Учение Пользовательские типы

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

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

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

[Учение \ DBAL \ DBALException] Неизвестный тип базы данных my_type_enum просил, Doctrine\DBAL\Platforms\PostgreSQL92Platform может не поддерживать
это

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

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

0

Решение

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

Если ваш не поддерживает, вы можете использовать Контейнер-Interop-доктрина. Это имеет поддержку для этого встроенный кажется (не пробовал сам)

<?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' => [],
],
],
],
];
2

Другие решения

Прежде всего, вы должны создать свой собственный тип, который расширяет тип 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

Следующим шагом будет регистрация нового типа, скажем, в вашей доктрине начальной загрузки или 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;
2

По вопросам рекламы [email protected]