Zend Framework 1.11 与 Doctrine 2 和命名空间


Zend Framework 1.11 with Doctrine 2 and namespaces

我一直在我的项目中使用Doctrine,但没有明确命名我的任何类。这导致了尝试将我的代码组织到单独的子目录中(或者至少看起来)的一些问题。因此,我尝试在我的代码中实现命名空间,但我正在努力并且在这里尝试了众多解决方案无济于事,我需要问。

我有标准的项目结构:

application/
--models/
--services/
--controllers/
..etc

在我的引导程序中,我有以下内容(我的代码中没有命名空间,工作正常):

/**
* Initialize Doctrine
* @return Doctrine_Manager
*/
public function _initDoctrine() {
    // include and register Doctrine's class loader
    require_once('doctrine/Doctrine/Common/ClassLoader.php');
    $autoloader = 'Zend_Loader_Autoloader::getInstance();
    require_once('doctrine/Doctrine/Common/ClassLoader.php');
    $commonLoader = new 'Doctrine'Common'ClassLoader('Doctrine'Common', 'doctrine');
    $autoloader->pushAutoloader(array($commonLoader, 'loadClass'), 'Doctrine'Common');
    $dbalLoader = new 'Doctrine'Common'ClassLoader('Doctrine'DBAL', 'doctrine');
    $autoloader->pushAutoloader(array($dbalLoader, 'loadClass'), 'Doctrine'DBAL');
    $ormLoader = new 'Doctrine'Common'ClassLoader('Doctrine'ORM', 'doctrine');
    $autoloader->pushAutoloader(array($ormLoader, 'loadClass'), 'Doctrine'ORM');
    $modelLoader = new 'Doctrine'Common'ClassLoader(NULL, APPLICATION_PATH . "/models");
    $autoloader->pushAutoloader(array($modelLoader, 'loadClass'), '');
    // create the Doctrine configuration
    $config = new 'Doctrine'ORM'Configuration();
    // setting the cache ( to ArrayCache. Take a look at
    // the Doctrine manual for different options ! )
    $cache = new 'Doctrine'Common'Cache'ArrayCache;
    $config->setMetadataCacheImpl($cache);
    $config->setQueryCacheImpl($cache);
    // choosing the driver for our database schema
    // we'll use annotations
    $driver = $config->newDefaultAnnotationDriver(
        APPLICATION_PATH . '/models'
        );
    $config->setMetadataDriverImpl($driver);
    // set the proxy dir and set some options
    $config->setProxyDir(APPLICATION_PATH . '/models/Proxies');
    $config->setAutoGenerateProxyClasses(true);
    //$config->setAutoGenerateProxyClasses(false);
    $config->setProxyNamespace('App'Proxies');
    // now create the entity manager and use the connection
    // settings we defined in our application.ini
    $connectionSettings = $this->getOption('doctrine');
    $conn = array(
    'driver'    => $connectionSettings['conn']['driv'],
    'user'      => $connectionSettings['conn']['user'],
    'password'  => $connectionSettings['conn']['pass'],
    'dbname'    => $connectionSettings['conn']['dbname'],
    'host'      => $connectionSettings['conn']['host']
    );
    $entityManager = 'Doctrine'ORM'EntityManager::create($conn, $config);
    // push the entity manager into our registry for later use
    $registry = Zend_Registry::getInstance();
    $registry->entitymanager = $entityManager;
    return $entityManager;
}

当我添加

namespace models;
到我的每个模型类

并将引导程序更新为如下所示,我得到一个异常"类应用程序不存在"(应用程序是我的模型之一):

$modelLoader = new 'Doctrine'Common'ClassLoader('models', APPLICATION_PATH . "/models");
$autoloader->pushAutoloader(array($modelLoader, 'loadClass'), 'models');

为了完整起见,我在控制器中引用该模型,如下所示:

public function indexAction()
{
    $this->_helper->layout()->title = "Your applications";
    $this->_helper->layout()->description = "Create, edit and view all applications you have registered with us.";
    $this->view->applicationList = $this->entityManager->getRepository("Application")->findAll();
}

我错过了什么?我敢肯定这是显而易见的,但现在真的正在拔头发。

经过多次搜索,我偶然发现了这个视频(需要登录)。

基本上,我解决的方法(根据网络研讨会)是将我的实体命名并将它们保存在/library 目录下。然后,每当我需要从实际应用程序中使用它们时,我都会通过它们的命名空间进行访问。