【问题标题】:Symfony error The class XXX was not found in the chain configured namespaces XXXSymfony 错误 The class XXX was not found in the chain configured namespaces XXX
【发布时间】:2014-05-13 20:17:18
【问题描述】:

已经有一些关于这个主题的其他问题,但没有一个是真正有帮助的。我是 Symfony 的新手,所以很难理解它。

我在文件 Client\IntranetBundle\LDAP\LDAPAuthenticationProvider.php 中,此代码导致错误:

$user = new LDAPUser($username);

我确实添加了它的命名空间:

use Client\IntranetBundle\LDAP\LDAPUser;

LDAPUser 实现 UserInterface

我得到的错误是

The class 'Client\IntranetBundle\LDAP\LDAPUser' was not found in the chain
configured namespaces Client\ClientBundle\Entity

这是什么意思?根据我的阅读,它与映射有关。

我在 config.yml 中的 Doctrine orm 设置为:

 orm:
    auto_generate_proxy_classes: %kernel.debug%
    auto_mapping: true

希望你能帮助我。

编辑#1

其实我发现不是

$user = new LDAPUser($username);

这是导致错误的原因,但它是在我尝试保留此实体时:

$entityManager->persist($user);

编辑 #2:

我对映射出了什么问题感到困惑:

<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

<entity name="Client\IntranetBundle\LDAP\LDAPUser" table="users" repository-class="Client\ClientBundle\Repository\UserRepository">
    <id name="id" type="integer" column="id">
        <generator strategy="AUTO" />
    </id>
    <field name="username" column="username" type="string" length="100" />
</entity>

也许是因为我在两个捆绑包之间跳跃?

【问题讨论】:

  • persist 导致错误(不是 new 实体实例化)

标签: php symfony doctrine


【解决方案1】:

默认情况下,auto_mapping 功能会在 Entity 命名空间下查找实体,因此鉴于您的实体不存在,Doctrine 对此一无所知。

您需要将您的实体放在Entity 命名空间下,或者手动配置 Doctrine 以添加您的自定义实体命名空间。这样您就失去了auto_mapping 功能,因此您需要手动注册每个捆绑包:

orm:
    auto_generate_proxy_classes: %kernel.debug%
    entity_managers:
        default:
            mappings:
                MyBundle:
                    type: annotation
                custom_mapping:
                    type: annotation
                    prefix: Client\IntranetBundle\LDAP\
                    dir: "%kernel.root_dir%/src/Client/IntranetBundle/LDAP/"
                    is_bundle: false

如您所见,最好将所有内容都放在包中的 Entity 命名空间下,让 Doctrine 来完成这项工作。

【讨论】:

  • 我明白了!但是为什么它要在另一个包的实体命名空间中查找呢?现在 LDAPUser 在捆绑 Client\IntranetBundle 中,但错误提示:在链配置的命名空间 Client\ClientBundle\Entity 中找不到。
  • 当这样的异常被抛出时,Doctrine 将转储所有的配置命名空间,基本上作为一个调试工具。由于您只注册了一个捆绑包,因此您只配置了一个实体命名空间。一旦您注册了更多捆绑包,您应该会看到更多,因为您再次遇到相同的异常。
  • 不,我有两个在 AppKernel 中注册的包:/。我仍然很困惑为什么它在另一个包的实体文件夹中查找。
  • 啊,但你是对的,我在 IntranetBundle 中没有任何实体文件夹。
  • 你在另一个包中有实体吗?如果你不这样做,Doctrine 当然不会向配置的命名空间添加一个不存在的命名空间。
【解决方案2】:

我的错误是我忘记在我的AppKernel 文件中的“供应商”中添加远程包/包。

它们没有在registerBundles() 方法中注册。

【讨论】:

    【解决方案3】:

    您的包应该与您在config/packages/doctrine.yaml (Symfony4) 配置文件中用于服务/命令/api 的正确实体管理器进行映射。

    例如,在以下原则配置中,BundleNamedefault 实体管理器映射,因此使用 default 实体管理器原则连接的代码可以访问和使用 BundleName 的实体和存储库。

    orm:
        entity_managers:
            default:
                mappings:
                  BundleName:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 2022-11-03
      • 2023-02-02
      相关资源
      最近更新 更多