使用自定义 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 那样工作