Doctrine无法加载类MappingException。

4

我只安装了Doctrine ORM,但是一直收到Product类的MappingException错误,请帮我解决。

<?php

namespace src;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product{

    /**
     * @ORM\Column(type="integer", length = 5)
     * @ORM\Id
     * @ORM\GenerateValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=2, name="product_code")
     */
    protected $code;

    /**
     * @ORM\Column(type="string", length=10, name="product_name")
     */
    protected $name;

}

我有一个普通的Bootstrap文件

<?php
// bootstrap.php
require_once "vendor/autoload.php";
require_once "src/Product.php";

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

$paths = array(__DIR__."/src");
$isDevMode = true;

$dbParams = array(
    'driver'   => 'pdo_mysql',
    'user'     => 'root',
    'password' => '',
    'dbname'   => 'myDbName',
);

$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
$entityManager = EntityManager::create($dbParams, $config);

$theProduct = $entityManager->find("Product", 500);

我有一个带有Composer的

{
  "require": {
    "doctrine/orm": "v2.5.10"
  },
  "autoload": {
    "psr-4": {
      "src\\": "src/"
    }
  }
}

文件夹结构如下图所示: enter image description here

我正在运行bootstrap.php

无论我做什么,总是会出现致命错误: 在D:\ projects \ pp \ vendor \ doctrine \ common \ lib \ Doctrine \ Common \ Persistence \ Mapping \ MappingException.php的第96行中,未捕获Doctrine \ Common \ Persistence \ Mapping \ MappingException:类'Product'不存在。


你的实体是否实际位于 __DIR__."/src"?你打印了该路径并检查一切是否正确吗?自动加载程序配置正确吗? - ccKep
我认为这是命名空间的问题,尝试删除 namespace src; 或通过 src\Product 请求实体管理器。最好有一个 src/entities 文件夹,并且没有命名空间的实体。在这种情况下,Doctrine 将处理它们的加载。如果您确实这样做:use src\Product,则自动加载程序可能会起作用。 - num8er
可能是一个重复的问题:Doctrine实体“类未找到” - num8er
我已经删除了 namespace src;use Doctrine\ORM\Mapping as ORM;。将所有的 @ORM\Entity 等转换为 @Entity,并在其他文档块中进行类似的更改,一切都开始正常工作了。有人能解释一下我的命名空间有什么问题吗? - user3410843
@num8er,关于命名空间有什么想法吗? - user3410843
显示剩余6条评论
1个回答

4

这里有两个问题

1)

createAnnotationMetadataConfiguration有第五个参数,布尔类型的$useSimpleAnnotationReader。如果你想写出下面这样的代码:

use Doctrine\ORM\Mapping as ORM
/**
 * @ORM\Entity
 */

在配置过程中,忽略第五个参数false。

$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode, null, null, false);

否则,如果您未包含Mapping和@ORM,它将与正常工作。
/**
* @Entity
*/

2)

如果您想要为实体添加命名空间,您需要将实体的命名空间添加到您的配置文件中。

$config->addEntityNamespace('', 'src\entity');

第一个参数是别名(您可以将其留空或者不管怎样,您放置的任何内容都应该附加在下一条语句的[:]前面),现在您可以调用

$theProduct = $entityManager->find(":Product", 500);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接