如何在基于模块的应用程序中集成Doctrine 2和Zend Framework 1.12

时间:2012-09-06 14:21:17

标签: php zend-framework module doctrine-orm

我一直在寻找关于如何整合Doctrine 2和Zend Framework 1.12(或1.11或其他 - 我真的不知道它是否重要但我正在使用的是1.12)的解释。我可以在Stack Overflow中找到几个博客文章,甚至可以解决问题,但在阅读完毕后,我无法理解我的目标:在模块化应用程序中执行。所以,如果有人能给我实现这一目标的钥匙,我将非常感激。

非常感谢!

修改
谢谢各位回复,但最近发布的ZF2让我决定离开ZF1,以便利用所有新的改进和功能。正如@KTastrophy所说,现在整合ZF和Doctrine要容易得多(我甚至敢说一切都比ZF2更容易和更一致)。再次感谢你!

3 个答案:

答案 0 :(得分:2)

使用doctrine PEAR安装将doctrine 2与ZF集成很容易。安装完成后,您只需将其放入引导程序中:

protected function _initDoctrine() {
    require_once "Doctrine/ORM/Tools/Setup.php";
    \Doctrine\ORM\Tools\Setup::registerAutoloadPEAR();

    $options = $this->getOptions();

    $loader = new \Doctrine\Common\ClassLoader('YourNamespace', realpath(APPLICATION_PATH . "/../library"));
    $loader->register();


    $isDevMode = (APPLICATION_ENV == 'production') ? false: true;
    $entityManager = \Doctrine\ORM\EntityManager::create(
        $options['doctrine']['dbal'],
        \Doctrine\ORM\Tools\Setup::createYAMLMetadataConfiguration(array(
            realpath(APPLICATION_PATH."/../library/YourNamespace/Yaml"),
        ), $isDevMode)
    );

    Zend_Registry::set('entityManager', $entityManager);

    return $entityManager;
}

$this->getOptions()从配置文件中检索数据库名称,用户和密码。

答案 1 :(得分:0)

如果您以本教程为例

http://christian.soronellas.es/2010/12/19/zend-framework-and-doctrine-2/?lang=en

请参阅配置代码的这一部分

$config = new Configuration();         
$config -> setMetadataCacheImpl($cache);         
$driverImpl = $config -> newDefaultAnnotationDriver($options['entitiesPath']);         
$config -> setMetadataDriverImpl($driverImpl);        
 $config -> setQueryCacheImpl($cache);        
 $config -> setProxyDir($options['proxiesPath']);         
$config -> setProxyNamespace('Application\Models\Proxies');         
$config -> setAutoGenerateProxyClasses(('development' == APPLICATION_ENV));        
 $em = EntityManager::create(             $this -> _buildConnectionOptions($options),             $config        );

newDefaultAnnotationDriver函数实际上采用了一系列权限路径。这为您创造了创造性的机会。当我发现这一点时,我只是在每个模块中创建一个实体文件夹,并沿着数组中的newDefaultAnnotationDriver参数传递每个路径。当然,通过这样做,您将需要为每个模块设置命名空间。

答案 2 :(得分:-1)

我使用Bisna

您应该应用此修补程序https://github.com/guilhermeblanco/ZendFramework1-Doctrine2/pull/45

这对我很有用。

在控制器中我有这个功能来检索实体管理器

/**
 * Retrieve the Doctrine Container.
 *
 * @return Doctrine\ORM\EntityManager
 */
public function getEntityManager()
{
    return $this->getInvokeArg('bootstrap')->getResource('doctrine')->getEntityManager();
}