2010-07-24 48 views

回答

8

我的工作與ZF1.10 also.You學說2集成並不需要在所有使用的原則自動加載的應用程序。

1)在你的application.ini文件中添加以下行(假設你已經安裝學說庫中的文件夾(與Zend的文件夾):

autoloadernamespaces.doctrine = "Doctrine" 

2)創建一個學說或EntityManager的資源。在你的ini文件中:

resources.entitymanager.db.driver = "pdo_mysql" 
resources.entitymanager.db.user = "user" 
resources.entitymanager.db.dbname = "db" 
resources.entitymanager.db.host = "localhost" 
resources.entitymanager.db.password = "pass" 
resources.entitymanager.query.cache = "Doctrine\Common\Cache\ApcCache" 
resources.entitymanager.metadata.cache = "Doctrine\Common\Cache\ApcCache" 
resources.entitymanager.metadata.driver = "Doctrine\ORM\Mapping\Driver\AnnotationDriver" 
resources.entitymanager.metadata.proxyDir = APPLICATION_PATH "/../data/proxies" 
resources.entitymanager.metadata.entityDir[] = APPLICATION_PATH "/models/entity" 

3)接下來,你需要引導它。我在資源文件夾中添加了一個資源類。請確保您映射到該文件夾​​中的ini文件:

pluginPaths.Application_Resource_ = APPLICATION_PATH "/resources" 

那麼你的資源類...

class Application_Resource_EntityManager 
extends Zend_Application_Resource_ResourceAbstract 
{ 
    /** 
    * @var Doctrine\ORM\EntityManager 
    */ 
    protected $_em; 

    public function init() 
    { 
     $this->_em = $this->getEntityManager(); 
     return $this->_em; 
    } 

    public function getEntityManager() 
    { 
     $options = $this->getOptions(); 
     $config = new \Doctrine\ORM\Configuration(); 
     $config->setProxyDir($options['metadata']['proxyDir']); 
     $config->setProxyNamespace('Proxy'); 
     $config->setAutoGenerateProxyClasses((APPLICATION_ENV == 'development')); 
     $driverImpl = $config->newDefaultAnnotationDriver($options['metadata']['entityDir']); 
     $config->setMetadataDriverImpl($driverImpl); 
     $cache = new Doctrine\Common\Cache\ArrayCache(); 
     $config->setMetadataCacheImpl($cache); 
     $config->setQueryCacheImpl($cache); 

     $evm = new Doctrine\Common\EventManager(); 
     $em = Doctrine\ORM\EntityManager::create($options['db'],$config,$evm); 

     return $em; 
    } 
} 

學說2實體管理器現在可用於您的應用程序。在你的控制器,你可以抓住它,像這樣:

$bootstrap = $this->getInvokeArg('bootstrap'); 
$em = $bootstrap->getResource('entitymanager'); 

我相信這將幫助別人:)

+0

以及存儲庫如何? @Entity(repositoryClass =「Entities \ ArticlesRepository」)我無法加載它們:( – cirpo 2010-11-13 11:42:36

+0

作爲參考,我還沒有機會使用此功能(Magento太忙了)根據文檔,對於repositorClass值必須是擴展學說\ ORM \ EntityRepository。 – David 2010-11-14 04:05:18

+0

也是一個完全合格的類名,你應該知道,你有例子是一個命名空間中的類。如果你不使用的命名空間,嘗試將完整的類名稱放在那裏(例如:Module_Model_Entities_ArticlesRepository)。 – David 2010-11-14 04:13:29

0

我會把模型在同一目錄下的「正常」 Zend框架模型生活。 /models

你可以告訴Doctrine在這個地方生成模型,並在"Default_Model"之前加上前綴。

退房約翰Lebenshold截屏約Zend框架的一個學說

Zend Screencasts

+0

我使用學說2的使用PHP 5.3「真」的命名空間,我不認爲我能做到這一點?我如何告訴zend自動加載器從「APPLICATION_PATH」加載我的「實體」和「代理」?我設法通過將我的實體和代理放在'library/Application'中來使它工作,它們位於包含路徑中,因此它可以工作 – 2010-07-25 06:36:51

1

從理論上說,你可以把任何地方,然後,只要命名空間解析正確。

我建議這樣的結構:

/application/models/MyApp/Entities 
/application/models/MyApp/Proxies 

裝入 'MyApp的' 使用學說的ClassLoader。我已經使用帶有Zend裝載機的裝載機學說(如果你有使用PEAR慣例命名空間文件夾中的類,你仍然需要使用Zend加載器)沒有衝突。

請記住,「模型」可不止是你的實體類的更多。我的模型層由接口,工廠,驗證器和服務對象組成。爲此,任何特定於應用程序的業務邏輯都應該放在模型文件夾中。

+0

如何配置Doctrine類加載器以使用zend自動加載器?我目前將我的實體放入'/ library/Application'文件夾中。然後在application.ini中添加'autoloaderNamespaces [] = Application'。它工作正常,因爲Zend Loader似乎能夠使用PHP 5.3命名空間,但是我無法從'include_path'之外的某處加載類。我很高興知道我可以如何使用Doctrine類加載器和Zend(指定自定義位置來查找文件)來執行此操作 – 2010-07-25 14:20:06

+0

請參閱本手冊的此部分:http://www.doctrine-project.org/projects/orm/ 2.0/docs/reference/configuration/en#bootstrapping:class-loading:git基本上,您可以使用Doctrine的ClassLoader加載任何PHP 5.3命名空間。只需提供基本的命名空間的名稱(如「主義」或「MyApp的」,並以文件夾的路徑,然後可以導入任何命名空間的類與「使用」關鍵字。 – 2010-07-25 19:13:17

+0

我知道,我現在的問題是怎麼做的我將Doctrine類加載器作爲類加載器添加到我的Zend應用程序中? – 2010-07-26 06:30:33