Doctrine,命名空间和自动加载实体

时间:2013-10-08 07:43:56

标签: php doctrine-orm namespaces doctrine autoload

我想在我的项目中使用Doctrine 2。我有一些问题。我阅读了文档,但可能是我做错了。

我想自动加载实体类。来自文档的方法无效。

我的bootstrap.php

<?php

require_once "vendor/autoload.php";
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\Driver;

$paths = array("../Entities");
$isDevMode = false;

$classLoader = new \Doctrine\Common\ClassLoader('Entities','../Entities');
$classLoader->register();

// the connection configuration
$dbParams = array(
    'driver'   => 'pdo_mysql',
    'user'     => 'xxx',
    'password' => 'xxx',
    'dbname'   => 'xxx',
);

$driver = new Doctrine\ORM\Mapping\Driver\AnnotationDriver(new Doctrine\Common\Annotations\AnnotationReader(),array('../Entities'));
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
$config->setMetadataDriverImpl($driver);
$em = EntityManager::create($dbParams, $config);

我在Entities目录中有我的模型类。我使用doctrine客户端生成它们。他们看起来不错。一开始有id,setter,getter和namespace。

/Entities/ArticleCat.php

<?php

namespace Entities;

use Doctrine\ORM\Mapping as ORM;

/**
 * ArticleCat
 *
 * @ORM\Table(name="article_cat")
 * @ORM\Entity
 */
class ArticleCat
{

我希望使用doctrine的脚本:

<?php
  require_once 'bootstrap.php';

  $article = $em->find('ArticleCat', 21);
  echo $article->getName();

它不起作用。只有当我以这种方式使用它并且从实体模型中删除命名空间时,它才有效。

<?php
  require_once 'bootstrap.php';
  require_once 'Entities/ArticleCat.php'; //this line added (manual load)


  $article = $em->find('ArticleCat', 21);
  echo $article->getName();

使用doctrine和autoload实体的正确方法是什么?为什么名称空间有问题?

我的错误:

Fatal error: Uncaught exception 'Doctrine\Common\Persistence\Mapping\MappingException' 
with message 'Class 'ArticleCat' does not exist' in 
/myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php:96
Stack trace: #0 /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php(40): 
Doctrine\Common\Persistence\Mapping\MappingException::nonExistingClass('ArticleCat') 
#1 /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping
   /AbstractClassMetadataFactory.php(267): Doctrine\Common\Persistence\Mapping
   \RuntimeReflectionService->getParentClasses('ArticleCat') 
#2 /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping
   /AbstractClassMetadataFactory.php(297): Doctrine\Common\Persistence\Mapping
   \AbstractClassMetadataFactory->getParentClasses('ArticleCat') 
#3 /myproject/vendor/doc in /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence
   /Mapping/MappingException.php on line 96

3 个答案:

答案 0 :(得分:2)

尝试使用名称空间的完全限定类名。 当您遇到有关 CG 代理类的错误时,请尝试通过运行

生成代理类
vendor/bin/doctrine orm:generate-proxies
祝你好运!

答案 1 :(得分:1)

如果你正在使用作曲家,你想确保你的composer.json中有以下'autoload':

{
        "require": {
           ...
        },
        "autoload": {
            "psr-0": {"": "Entity/"}
        }
}

这解决了我的问题。我虽然没有在我的实体类中使用任何命名空间。我的composer.json位于我的inc目录中,此处引用的Entity目录位于inc / Entity。

答案 2 :(得分:0)

嗯,我在使用命名空间时总是使用ClassLoader。我使用它时遇到了很多麻烦,我使用的排序配置类包含了我需要的所有path/to/src

E.g。如果您的路径为path/to/src且您的班级名称为Entities\ArticleCat,则文件ArticleCat.php的位置的目录结构为

src \
  Entities \
    ArticleCat.php

现在您需要做的就是为ClassLoader

创建Entities
$src = 'path/to/src'
$cl = new ClassLoader('Entities', $src);
$cl->register();
现在应使用ArticleCat

提供

和课程EntityManager

$articleCat = $em->getRepository('Entities\ArticleCat');
$article = $articleCat->find(21);
echo $article->getName();

$article = $em->find('Entities\ArticleCat', 21);
echo $article->getName();