Symfony错误在链配置的命名空间XXX中找不到类XXX

19 php doctrine symfony

关于这个问题还有其他一些问题,但没有一个真正有用.我是Symfony的新手,所以我很难理解它.

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

$user = new LDAPUser($username);
Run Code Online (Sandbox Code Playgroud)

我添加了它的命名空间,它是:

use Client\IntranetBundle\LDAP\LDAPUser;
Run Code Online (Sandbox Code Playgroud)

LDAPUser实现UserInterface

我得到的错误是

The class 'Client\IntranetBundle\LDAP\LDAPUser' was not found in the chain
configured namespaces Client\ClientBundle\Entity
Run Code Online (Sandbox Code Playgroud)

那是什么意思?从我读到的内容来看,它与映射有关.

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

 orm:
    auto_generate_proxy_classes: %kernel.debug%
    auto_mapping: true
Run Code Online (Sandbox Code Playgroud)

希望你能帮助我.

编辑#1:

实际上,我发现事实并非如此

$user = new LDAPUser($username);
Run Code Online (Sandbox Code Playgroud)

这导致错误,但是当我试图坚持这个实体时:

$entityManager->persist($user);
Run Code Online (Sandbox Code Playgroud)

编辑#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>
Run Code Online (Sandbox Code Playgroud)

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

Alb*_*dez 35

默认情况下,该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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,最好将所有内容放在Entity捆绑包中的名称空间下,然后让Doctrine进行艰苦的工作.

  • 当抛出类似的异常时,Doctrine将转储所有配置命名空间,基本上作为调试工具.由于您只注册了一个捆绑包,因此只配置了一个实体命名空间.一旦您注册了更多的包,您应该会看到更多,因为您再次出现相同的异常. (2认同)
  • 另一个包中有实体吗?如果不这样做,Doctrine 当然不会将不存在的命名空间添加到配置的命名空间中。 (2认同)