Symfony2:传递给 Doctrine\ORM\EntityRepository::__construct() 的参数 2 必须是 Doctrine\ORM\Mapping\ClassMetada

Posted

技术标签:

【中文标题】Symfony2:传递给 Doctrine\\ORM\\EntityRepository::__construct() 的参数 2 必须是 Doctrine\\ORM\\Mapping\\ClassMetadata 的实例,没有给出【英文标题】:Symfony2 : Argument 2 passed to Doctrine\ORM\EntityRepository::__construct() must be an instance of Doctrine\ORM\Mapping\ClassMetadata, none givenSymfony2:传递给 Doctrine\ORM\EntityRepository::__construct() 的参数 2 必须是 Doctrine\ORM\Mapping\ClassMetadata 的实例,没有给出 【发布时间】:2015-01-26 17:01:21 【问题描述】:

我正在尝试使用 FOSOAuthServerBundle 在我的实际 symfony2 项目中实现 OAuth2。

我一直在关注这个Article 来实现它。

由于我不使用 FOS 用户包,我必须创建一个 UserProvider。

我也在使用 A User Repository,就像他在 Article 中所做的那样。

我一直被这个错误困扰:

ContextErrorException:可捕获的致命错误:传递给 Doctrine\ORM\EntityRepository::__construct() 的参数 2 必须是 Doctrine\ORM\Mapping\ClassMetadata 的实例,没有给出,在 /app/cache/dev/appDevDebugProjectContainer 中调用。 php 在第 3527 行并在 /app/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php 第 67 行中定义

我已经按照 services.yml 的给定代码:

并将其转换为 Yaml,这里是我的文件 (services.yml):

imports:
    -  resource: parameters.yml 

parameters:
#   wca_transition.example.class: WCA\TransitionBundle\Example
    collection.import.from_email: "%import_from_email%"
    collection.import.to_email: "%import_to_email%"
    platform.entity.user.class: WCA\ServerBundle\Entity\Profile
    platform.user.provider.class: WCA\ServerBundle\Provider\ProfileProvider

services:
#    wca_betosee_transition.example:
#        class: %wca_transition.example.class%
#        arguments: [@service_id, "plain_value", %parameter%]

    collectionImportCommand:
        class: WCA\ServerBundle\Command\CollectionImporterCommand
        calls:
        - [setContainer, ["@service_container"] ]

    platform.user.manager:
        class: Doctrine\ORM\EntityManager
        factory-service: doctrine
        factory-method: getManagerForClass
        arguments: ["%platform.entity.user.class%"]

    platform.user.repository:
        class: WCA\ServerBundle\Model\ProfileRepository
        factory-service: platform.user.manager
        factory-method: getRepository
        arguments: ["%platform.entity.user.class%"]

    platform.user.provider:
        class: "%platform.user.provider.class%"
        # arguments: ["@platform.user.repository"]

    platform.grant_type.api_key:
        class: WCA\ServerBundle\OAuth\ApiKeyGrantExtension
        arguments: ["@platform.user.repository"]
        tags:
            -  name: fos_oauth_server.grant_extension, uri: http://mywebsite.local/grants/api_key 

我想给定的错误来自我的配置,但我看不出有什么问题,因为我遵循了给定的内容。创建的服务没有得到给定的参数(“没有给定”),或者我没有传递正确的参数。

有什么想法或提示吗?

PS:如果您需要任何其他文件,请不要犹豫,我会更新帖子。

【问题讨论】:

我怀疑它是否会有所帮助,但尝试将 factory-service,factory-method 更改为 factory_service 和 factory_method 以匹配 symfony 文档。 @Cerad 是对的。你的配置有错别字。 这确实是解决方案!谢谢!如果@Cerad 想写答案,我很乐意将其设置为正确答案。 【参考方案1】:

我怀疑它是否会有所帮助,但尝试将 factory-service、factory-method 更改为 factory_service 和 factory_method 以匹配 Symfony 文档。

【讨论】:

【参考方案2】:

听起来这是唯一一篇很好地描述了如何实现 FOS OAuth2 捆绑包的文章,甚至比他们自己的文档还要好。 但是由于某种原因,服务是在 xml 中定义的,我觉得这很奇怪和丑陋。

无论如何,正如@Cerad 所提到的,如果您将 xml 服务转换为 yaml 格式,那么您必须将 - 替换为 _ 并且它会正常工作。

【讨论】:

是的,这确实是解决方案。感谢您的反馈。

以上是关于Symfony2:传递给 Doctrine\ORM\EntityRepository::__construct() 的参数 2 必须是 Doctrine\ORM\Mapping\ClassMetada的主要内容,如果未能解决你的问题,请参考以下文章

级联持久性不工作(Doctrine ORM + Symfony 2)

Doctrine - 传递给 __construct 的参数必须是一个数组

Doctrine ORM:NULL到DateTime转换错误

如何在 Doctrine ORM 中使用 createQueryBuilder 选择特定列?

设计模式 Doctrine ORM - 根据输入生成唯一名称

Symfony2 中 ObjectManager 和 EntityManager 的区别?