zend表达+主义自定义类型

时间:2016-09-22 11:35:40

标签: php doctrine-orm enums zend-expressive

我正在尝试将自定义类型映射到字符串。这是我的实体定义:

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

但是当我尝试创建迁移(migration:diff)时,这就是输出

[学说\ DBAL \ DBALException]       请求的未知数据库类型my_type_enumDoctrine\DBAL\Platforms\PostgreSQL92Platform可能不支持       rt it。

似乎我需要使用my_type_enum将自定义类型mapping_types映射到字符串,但Zend Expressive中的位置?似乎我的配置被忽略了

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

2 个答案:

答案 0 :(得分:3)

zend-expressive本身并没有建立学说支持。这取决于你正在使用的学说模块及其工厂。工厂使用配置启动doctrine服务。所以我会查看doctrine工厂内部以了解它是如何以及是否支持自定义映射类型。

如果您不支持,可以使用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' => [],
            ],
        ],
        'types' = [
            'typename' => Type::class,
        ], // <-----
    ],
];

答案 1 :(得分:2)

首先,您必须创建扩展doctrine 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

下一步是注册新类型,比如说你的doctrine 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;