使用自定义 Doctrine 2 数据类型的依赖注入

Posted

技术标签:

【中文标题】使用自定义 Doctrine 2 数据类型的依赖注入【英文标题】:Dependency injection with custom Doctrine 2 data type 【发布时间】:2016-11-08 21:52:01 【问题描述】:

我有与Dependency injection with custom Doctrine 2 hydrator 几乎相同的问题,但我需要将服务注入自定义数据类型,而不是注入水合器。

引用问题中的解决方案依赖于复制和修改教义源代码,因为教义初始化类本身。希望另一种方法对自定义数据类型可行?

这是一个 Symfony3 应用程序,如果可以在那里应用一些魔法的话。

【问题讨论】:

让这件事变得困难的是 Doctrine 如何实例化自定义数据类型。教义的Type::addType($name, $className) 方法只需要类名,而不是类的实例。您可以做的是在您的 bundles 扩展类中添加您的自定义原则类型,然后在 kernel.request 上注册一个具有所需依赖项的事件侦听器服务,并通过调用 \Doctrine\DBAL\Types::getType($name)->setSomeDependency($dependency); 将它们设置为您的数据类型。不过有点乱。 @ChadSikorra 这类似于我在发布问题后发现的方法here,没有事件侦听器。我现在正在尝试这个,它看起来很有希望。添加您的评论作为答案,我会接受。 【参考方案1】:

根据最初问题中的 cmets:

让这件事变得困难的是 Doctrine 如何实例化自定义数据类型。教义的Type::addType($name, $className) 方法只需要类名,而不是类的实例。您可以做的是在您的 bundles 扩展类中添加您的自定义原则类型,然后在 kernel.request 上注册一个具有所需依赖项的事件侦听器服务,并通过调用 \Doctrine\DBAL\Types::getType($name)->setSomeDependency($dependency); 将它们设置为您的数据类型。不过有点乱。

很好地找到了 Matthias 的文章。扩展类的boot() 方法看起来确实是一个更自然的设置依赖项的地方。

【讨论】:

以上是关于使用自定义 Doctrine 2 数据类型的依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine / Symfony:在使用 QueryBuilder 之前将自定义类型转换为数据库值

教义自定义数据类型

[Doctrine Migrations] 数据库迁移组件的深入解析三:自定义数据字段类型

Doctrine2 自定义类型不像主键 Symfony2 那样工作

Doctrine 2 自定义 ObjectMultiCheckbox 值

教义自定义映射类型架构更新