2010-07-24 19 views
8

nếu tôi tích hợp Zend Framework 1.10 với Doctrine 2 nơi tôi đặt Mô hình/Thực thể và Proxy của Doctrine? tôi đã nghĩ đến các thư mục /application hoặc /library. nếu tôi đặt trong thư mục /library tho, nó sẽ can thiệp vào các lớp tự động tải ZF từ đó vì các lớp sẽ sử dụng các không gian tên PHP 5.3 so với các không gian tên kiểu PEAR.Tích hợp ZF/Doctrine2: Tôi đặt các Mô hình/Thực thể & Lớp proxy của mình ở đâu

Trả lời

8

Tôi đang làm việc trên một ứng dụng tích hợp Doctrine 2 với ZF1.10. Bạn không cần sử dụng trình tải tự động của Doctrine.

1) Trong file application.ini bạn thêm dòng sau (giả sử bạn đã cài đặt thuyết trong thư mục thư viện của bạn (giống như thư mục Zend):

autoloadernamespaces.doctrine = "Doctrine" 

2) Tạo một học thuyết hoặc EntityManager tài nguyên. Trong tệp ini của bạn:

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) Tiếp theo, bạn sẽ cần phải khởi động lại. Tôi đã thêm một lớp tài nguyên trong thư mục tài nguyên của mình. Hãy chắc chắn rằng bạn ánh xạ đến thư mục trong file ini của bạn:

pluginPaths.Application_Resource_ = APPLICATION_PATH "/resources" 

Sau đó, lớp tài nguyên của bạn ...

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; 
    } 
} 

Học thuyết 2 quản lý thực thể bây giờ đã có để ứng dụng của bạn. Trong điều khiển của bạn, bạn có thể lấy nó như vậy:

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

Tôi chắc chắn điều này sẽ giúp ai đó :)

+0

và kho lưu trữ là gì? @Entity (repositoryClass = "Entities \ ArticlesRepository") Tôi không thể tải chúng. :( – cirpo

+0

Là một FYI, tôi chưa có cơ hội sử dụng tính năng này (Đã quá bận với Magento). giá trị cho repositorClass phải là một tên lớp đủ điều kiện mở rộng Doctrine \ ORM \ EntityRepository – David

+0

Ngoài ra, bạn nên lưu ý rằng ví dụ bạn có là một lớp không có tên, nếu bạn không sử dụng các không gian tên, thử đặt tên lớp đầy đủ trong đó (ví dụ: Module_Model_Entities_ArticlesRepository). – David

0

Tôi sẽ đặt các Mô hình trong cùng thư mục nơi mô hình khung công tác Zend "bình thường". /models

Bạn có thể yêu cầu Doctrine tạo mô hình tại địa điểm này và đặt tiền tố cho chúng bằng "Default_Model" hoặc bất kỳ thứ gì.

Check-out một trong John Lebenshold Screencasts về Zend Framework và Doctrine

Zend Screencasts

+0

tôi đang sử dụng Doctrine, 2 trong đó sử dụng PHP 5.3 namespace "true", tôi không nghĩ rằng tôi có thể làm điều đó ? làm thế nào tôi có thể nói với zend autoloader để tải của tôi ''Entities'' & '' Proxies'' từ 'APPLICATION_PATH'?tôi quản lý để làm cho nó hoạt động bằng cách đặt các thực thể và proxy của tôi trong 'thư viện/ứng dụng', nơi chúng nằm trong đường dẫn bao gồm để nó hoạt động –

1

Về lý thuyết, bạn có thể đặt sau đó bất cứ nơi nào, miễn là các không gian tên giải quyết chính xác.

tôi sẽ đề nghị cấu trúc này:

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

Nạp 'MyApp' sử dụng ClassLoader Học thuyết của. Tôi đã không có xung đột bằng cách sử dụng bộ tải Doctrine với Zend Loader (nếu bạn có các lớp sử dụng PEAR convention bên trong thư mục namespace của bạn, bạn vẫn sẽ cần sử dụng Zend Loader).

Hãy nhớ rằng 'mô hình' có thể không chỉ là các lớp Thực thể của bạn. Lớp mô hình của tôi bao gồm các giao diện, nhà máy, trình duyệt tính hợp lệ và các đối tượng dịch vụ. Để kết thúc, bất cứ điều gì đó là ứng dụng logic kinh doanh cụ thể có lẽ nên đi trong thư mục mô hình.

+0

làm thế nào để cấu hình bộ nạp lớp Doctrine để làm việc với bộ nạp tự động zend? tôi hiện đang đặt thực thể của tôi vào thư mục '/ library/Application'. sau đó trong application.ini thêm 'autoloaderNamespaces [] = Application'. nó hoạt động tốt như Zend Loader dường như có thể làm việc với các không gian tên PHP 5.3, tuy nhiên tôi không thể làm cho nó tải các lớp từ một nơi nào đó bên ngoài 'include_path'. nó sẽ là tốt để biết làm thế nào tôi có thể làm điều này với bộ nạp lớp Doctrine và Zend (chỉ định vị trí tùy chỉnh để tìm tệp) –

+0

Xem phần hướng dẫn này: http://www.doctrine-project.org/projects/orm/ 2.0/docs/reference/configuration/en # bootstrapping: class-loading: git Về cơ bản, bạn có thể sử dụng ClassLoader của Doctrine để tải bất kỳ không gian tên PHP 5.3 nào. Chỉ cần cung cấp tên của vùng tên cơ sở (như 'Doctrine' hoặc 'MyApp' và một đường dẫn đến thư mục. Sau đó bạn có thể nhập bất kỳ lớp không gian tên nào bằng từ khoá 'use'. –

+0

tôi biết, câu hỏi của tôi bây giờ là làm thế nào để tôi thêm trình nạp lớp Doctrine làm trình nạp lớp vào Ứng dụng Zend của tôi? –

Các vấn đề liên quan