如何在Doctrine中手动生成代理而不使用CLI?

6

我正在使用Zend Framework创建一个Web应用程序。基于多个推荐,我选择将Doctrine作为我的RDBM系统。

;---------------------------------------------------
; DOCTRINE CONFIGURATION
;---------------------------------------------------
resources.entityManager.connection.driver = "pdo_mysql"
resources.entityManager.connection.host = "localhost"
resources.entityManager.connection.dbname = "private"
resources.entityManager.connection.user = "private"
resources.entityManager.connection.password = "private"
resources.entityManager.connection.entities = APPLICATION_PATH "/models"
resources.entityManager.connection.proxies.location = APPLICATION_PATH "/models/Proxies"
resources.entityManager.connection.proxies.ns = "Proxies"

; According to Doctrine manual, this should be true for 
; development, and false for production
resources.entityManager.connection.proxies.generate = true

上面是我的Zend应用程序配置中的Doctrine配置。一切都很顺利,但我想提前了解如何手动生成代理而不使用CLI,因为几个原因。首先,Doctrine 2.0文档提到自动生成代理会导致性能问题。其次,我仍然没有弄清楚如何使用Doctrine CLI,特别是我已经将项目开发转移到了没有命令提示符访问权限的共享服务器。 我一直通过创建类来手动生成Doctrine实体,那么如何手动生成Doctrine代理?
1个回答

7
我发现了一种简单的生成代理的方法:
    $proxyDir = null; //to genearate to default proxy dir
    $proxyFactory = $em->getProxyFactory();
    $metadatas = $em->getMetadataFactory()->getAllMetadata();
    $proxyFactory->generateProxyClasses($metadatas, $proxyDir);

生成实体,请使用以下命令:
    $classes = $em->getClassMetadataFactory()->getAllMetadata();
    $generator = new \Doctrine\ORM\Tools\EntityGenerator(); 
    $generator->setGenerateAnnotations(true); 
    $generator->setGenerateStubMethods(true); 
    $generator->setRegenerateEntityIfExists(false); 
    $generator->setUpdateEntityIfExists(true); 
    $generator->generate($classes, '/path/to/generate/entities');

我们有实体,但是你代码的第三行($metadatas那一行)给我们带来了错误:在C:\Zend\Apache2\htdocs\Webate\library\Doctrine\ORM\Mapping\MappingException.php:193中抛出未捕获的异常'Doctrine\ORM\Mapping\MappingException',消息为“文件映射驱动程序必须具有有效的目录路径,但给定的路径似乎不正确!” - NightRaven
您需要在EntityManager中设置代理路径,以下是我旧项目的代码示例:$config = new \Doctrine\ORM\Configuration; $config->setMetadataCacheImpl(self::getCache()); $config->setMetadataDriverImpl(new \qweb\driver\DoctrineYml( QWEB_MODULE )); $config->setEntityNamespaces(array('base')); $config->setProxyDir(DOCTRINE_PROXIES); $config->setProxyNamespace('proxy'); $connection = \Doctrine\DBAL\DriverManager::getConnection(self::loadYml(QWEB_CONFIG.DIRECTORY_SEPARATOR.'databases.yml')); $em = \Doctrine\ORM\EntityManager::create($connection, $config); - El'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接