zend表达+教条自定义类型

zend表达+教条自定义类型

问题描述:

我想将自定义类型映射到字符串。这里是我的实体定义:zend表达+教条自定义类型

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

但是当我尝试创建迁移(迁移:DIFF)这是输出

[主义\ DBAL \ DBALException] 未知的数据库类型my_type_enum要求,Doctrine\DBAL\Platforms\PostgreSQL92Platform不得suppo rt it。

似乎我需要映射我的自定义类型my_type_enum到一个字符串使用mapping_types,但在Zend表达?它似乎我的配置被忽略

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

Zend的表现力的本身并没有在教义支持的版本。这取决于学说模块及其工厂,您正在使用。工厂使用配置启动教条服务。所以我会在教条工厂里面找出它是如何以及它是否支持自定义映射类型。

如果您不支持它,您可以使用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

首先,你必须创建一个扩展学说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;