Zend Framework 1.11 + Doctrine 2集成:自动加载模型models / user.php - >型号\用户

时间:2010-12-17 02:16:34

标签: zend-framework autoload doctrine-orm

如何设置自动加载,以便我可以拥有像

这样的目录结构
/application
    /models  <<--- plural
    ...

让Zend / Doctrine Autoloader加载Application\Model\User。注意模型是单数的。

目前我的自动加载器设置如下(Bootstrap.php _initDoctrine()

$zendAutoloader = Zend_Loader_Autoloader::getInstance();

// Symfony
$autoloader = array(new ClassLoader('Symfony'), 'loadClass');
$zendAutoloader->pushAutoloader($autoloader, 'Symfony\\');

// Doctrine 
$autoloader = array(new ClassLoader('Doctrine'), 'loadClass');
$zendAutoloader->pushAutoloader($autoloader, 'Doctrine\\');

// Models
$autoloader = array(new ClassLoader('Application\\Model', realpath(__DIR__ . '/models')), 'loadClass');
$zendAutoloader->pushAutoloader($autoloader, 'Application\\Model');

// Proxies
$autoloader = array(new ClassLoader('Application\\Model\\Proxy', realpath(__DIR__ . '/models/proxies')), 'loadClass');
$zendAutoloader->pushAutoloader($autoloader, 'Application\\Model\\Proxy');

目前,当我尝试使用Application\Model\User时,我得到了

  

require(D:\Projects\Tickle\application\models\Application\Model\User.php): failed to open stream: No such file or directory

它试图加入application\models\Application\Model\User.php。它比我想象的更加狡猾。我怎么能解决它?

2 个答案:

答案 0 :(得分:2)

尝试:

$modelsClassLoader = new ClassLoader('Application\Model', __DIR__ . '/models');
$modelsClassLoader->register();

答案 1 :(得分:0)

我解决这个问题的方法是使用Doctrine的自动加载器/ ClassLoader而不是Zend的

// disable Zend Autoloader
spl_autoload_unregister(array('Zend_Loader_Autoloader','autoload'));

// use Doctrine2's Class Loader
$autoloader = new ClassLoader('Zend');
$autoloader->setNamespaceSeparator('_');
$autoloader->register();

// Symfony
$autoloader = new ClassLoader('Symfony');
$autoloader->register();

// Doctrine 
$autoloader = new ClassLoader('Doctrine');
$autoloader->register();

// Application
$autoloader = new ClassLoader('Application', realpath(__DIR__ . '/..'));
$autoloader->register();

我的一个错误是我应该使用realpath(__DIR__ . '/..')与我的目录结构,...

/Tickle (Project name)
    /application
        /models
            /proxies
...

指向“Tickle”,以便当doctrine追加路径“Application / Models / User.php”时,它将看起来像“/Tickle/Application/Models/Users.php”存在