Zend资源自动加载PHP 5.3命名空间

时间:2011-05-18 06:53:51

标签: php zend-framework

我正在尝试从Doctrine MongoDB实现中自动加载一些文档,但我不确定如何。据该网站称,资源自动加载器认为你的命名空间将使用下划线(_)而不是新的命名空间。

作为一个例子,我想运行这一行:

if(!$this->dm->getRepository('Documents\User')->findOneBy(array('email'=>$userInfo['email']))){
        $user = new User();
 //...

无需使用require。但是,现在当我尝试在bootstrap中使用资源加载器时,它告诉我它无法加载php文件。

存储库是Repository \ User命名空间,User()位于Document \ User命名空间中。

这是我的引导程序

    $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath'  => APPLICATION_PATH.'/models/documents/',
'namespace' => 'Documents',

));

有没有办法做到这一点,还是我在模特中使用require_once?

谢谢,

-Zend Noob

2 个答案:

答案 0 :(得分:4)

你可以使用Matthew Weier O'Phinneys Backported ZF2 Autoloaders

功能

  • PSR-0兼容include_path自动加载
  • 符合PSR-0标准的每个前缀或命名空间自动加载
  • 类图自动加载,包括类图生成
  • Autoloader工厂一次性加载多个自动加载器策略

示例

protected function _initAutoloader()
{
    require_once 'path/to/library/ZendX/Loader/StandardAutoloader.php';
    $loader = new ZendX_Loader_StandardAutoloader(array(
        'namespaces' => array(
            'Repository' => APPLICATION_PATH . '/models/',
            'Document'   => APPLICATION_PATH . '/models/',
        ),
    ));
    $loader->register(); // register with spl_autoload_register()
}

答案 1 :(得分:1)

Zend自动加载器不会为5.3命名空间代码剪切它。

最简单的方法是将Doctrine的类加载器推入Zend版本。

在Bootstrap中使用类似的内容而不是上面的代码。在此示例中,我假设DocumentRepository文件夹位于APPLICATION_PATH . '/models'

protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();

    require_once 'Doctrine/Common/ClassLoader.php';

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

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

    return $autoloader;
}