4

我有兴趣将 Doctrine 用作我正在编写的新 Zend Framework 应用程序的 ORM。我试图找出尽可能简单地集成它的最佳方法。我发现的每个示例都不同,其中很多都早于 ZF 1.8 中新的自动加载功能。他们都没有为我工作过。

有没有人有这样做的好方法?我倾向于将它放在我的引导文件中,但有些人建议制作一个 Zend_Application_Resource 插件。困难的部分似乎是让 Doctrine 命名空间和默认情况下不遵循 Zend 自动加载约定的模型类的加载路径正常工作。

有什么想法吗?谢谢。

4

3 回答 3

3

几周前我为 Doctrine 和 Zend Framework 编写了一个 Resource Bootstrapper 并将其全部变成了一个小型包装框架,因为我认为 ZF 和 Doctrine 是一个很棒的团队。您可以在此处阅读文章:http: //coffeecoders.de/2009/06/using-the-zend-framework-18-bootstrapper-and-doctrine-110/

它可以通过 Bootstrap 资源配置完全配置(也包括示例)。不幸的是,Doctrine 在模型文件夹中搜索具有与文件名相同的类名(与 ZF 命名方案不匹配)的模型,因此实际上不可能摆脱注册 Doctrine Autoloader。资源加载器如下所示:

<?php
/**
 * Doctrine model loading bootstrap resource. Options must provide a connection string.
 * directory option for model directory is optional (default is ./models).
 * Further options will be set for the Doctrine manager via setAttribute (e.g. model_loading). 
 * @author daff
 */
class Cuckoo_Application_Resource_Model extends Zend_Application_Resource_ResourceAbstract
{
    public function init()
    {
        $manager = Doctrine_Manager::getInstance();
        $options = $this->getOptions();

        foreach($options as $key => $value)
        {
           if($key != 'connection' && $key != 'directory')
                    $manager->setAttribute($key, $value);
        }

        if(empty($options['connection']))
            throw new Exception("No database connection string provided!");
        Doctrine_Manager::connection($options['connection']);
        if(empty($options['directory']))
            $dir = './models';
        else
            $dir = $options['directory'];
        Doctrine::loadModels(realpath($dir));
        return $manager;
    }
}
于 2009-06-10T13:08:27.170 回答
1

http://weierophinney.net/matthew/archives/220-Autoloading-Doctrine-and-Doctrine-entities-from-Zend-Framework.html

看看这篇文章。它给出了详细的解释、目录结构以及如何使用自动加载功能。

于 2009-11-06T08:27:34.923 回答
0

就自动加载而言,您实际上可以很容易地将 Doctrine 加载器与新的 Zend_Loader_Autoloader 堆栈一起使用。看看这个页面,特别是它提到 pushAutoloader() 方法的地方。

不过,这是基本的运行情况:

$autoloader = Zend_Loader_Autoloader->getInstance();
$autoloader->pushAutoloader(array('Doctrine', 'autoload'), 'Doctrine');

这将只对以 Doctrine 开头的类使用 Doctrine 自己的自动加载器,如果堆栈中的其他自动加载器尚未找到它们。

希望这个对你有帮助。

于 2009-06-10T05:50:09.177 回答