2013-10-08 42 views
3

我想在我的項目中使用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); 

我有我的模型類的實體目錄。我已經使用教義客戶端生成了它們。他們看起來不錯。開頭有ids,setters,getters和namespace。

/Entities/ArticleCat.php

<?php 

namespace Entities; 

use Doctrine\ORM\Mapping as ORM; 

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

我的劇本,我想用學說:

<?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(); 

什麼是使用原則和自動加載實體的正確方法?爲什麼命名空間是一個問題?

我的錯誤:

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 
+1

http://stackoverflow.com/q/20348484/637210這可能是有用的,你可以添加命名空間別名和使用它像 「找到( 'NS:ArticleCat',21)」 – Mikl

回答

2

嘗試與命名空間中使用完全限定類名。 當你運行

vendor/bin/doctrine orm:generate-proxies 

運氣好遇到錯誤約CG代理類嘗試生成您的代理類!

+0

如何你會「跑」嗎?這不是一行代碼。 – CommaToast

+0

@CommaToast,這是一個shell腳本 –

1

如果使用的是作曲家,你要確保你有以下的「自動載入」你composer.json:

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

這解決了這個問題對我來說。雖然我沒有在實體類中使用任何名稱空間。我的composer.json位於我的inc目錄中,此處引用的Entity目錄位於inc/Entity中。

0

嗯,我一直使用ClassLoader當談到使用命名空間。我遇到了很多麻煩,我正在使用一個排序配置類,並且需要我所有的path/to/src

E.g.如果你的路徑是path/to/src和你的類名是Entities\ArticleCat則文件ArticleCat.php位置的目錄結構

src \ 
    Entities \ 
    ArticleCat.php 

現在,所有你需要做的就是創建一個ClassLoaderEntities

$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();