2016-09-22 3 views
0

Я пытаюсь сопоставить настраиваемый тип с строкой. Вот мое определение сущность:zend expressive + doctrine custom types

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

Но когда я пытаюсь создать миграции (Migration: Diff) Это выход

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

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

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

ответ

2

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

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

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

+1 для https://github.com/DASPRiD/container-interop-doctrine Мы используем его, и как это много. DASPRiD - надежный архитектор и постоянный сопровождающий. – dualmon

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; 
Смежные вопросы