我想在我的项目中使用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
答案 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();