[英]zend expressive + doctrine custom types
我正在尝试将自定义类型映射到字符串。 这是我的实体定义:
/**
* @var string
*
* @ORM\Column(name="type", type="string", columnDefinition="my_type_enum", nullable=false)
*/
但是,当我尝试创建迁移(migration:diff)时,这是输出
[Doctrine \\ DBAL \\ DBALException]请求了未知的数据库类型my_type_enum
, Doctrine\\DBAL\\Platforms\\PostgreSQL92Platform
可能不支持它。
似乎我需要使用mapping_types
将自定义类型my_type_enum
到字符串,但是Zend Expressive中的何处? 看来我的配置被忽略了
...
'doctrine' => [
'dbal' => [
'mapping_types' => [
'my_type_enum' => 'string'
]
]
]
...
zend-expressive本身没有内置的学说支持。它取决于您所使用的学说模块及其工厂。 工厂使用配置启动理论服务。 因此,我将深入研究原则工厂,以了解其如何以及是否支持自定义映射类型。
如果您的服务器不支持它,则可以使用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,
], // <-----
],
];
首先,您必须创建扩展了理论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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.