【问题标题】:Integrate Doctrine with Zend Framework 1.8 app将 Doctrine 与 Zend Framework 1.8 应用程序集成
【发布时间】:2010-11-01 16:13:49
【问题描述】:

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

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

有什么想法吗?谢谢。

【问题讨论】:

    标签: php zend-framework orm doctrine


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      几周前我为 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;
          }
      }
      

      【讨论】:

      • 谢谢。我最终采用了类似的方法。 Matthew Lurz 为 ZendX 资源插件编写了proposal。他粘贴了一些初始的specificationscode。它与您所拥有的相似,并且解决了我的问题。
      【解决方案3】:

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

      不过,这是基本的失败:

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

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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-06-27
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-25
        相关资源
        最近更新 更多