2011-11-06 115 views
3

试图让我的脚在ZF2上变得潮湿,我偶然发现了我的第一个问题。假设一个模块上我想用Shanty_Mongo(外部库连接到MongoDB中)Zend Framework 2库路径

所以,我复制磁带库的整个棚户目录并创建了一个新的模型类:

namespace Dummy\Model; 

use Shanty\Mongo\Document; 

class Dummy extends Shanty_Mongo_Document { 
    public function setConnections($connections) { 
    Shanty_Mongo::addConnections($connections); 
    } 
} 

(该如果我已经理解了,setConnections()将被DI使用)

这似乎无法找到Shanty_Mongo_Document。我应该添加一些东西到application.config.php指向额外的库?

+0

尝试'使用Shanty \ Mongo \ Document作为文档',然后'class Dummy extends Document'。我对这些命名空间并不太坚定,但是如果我理解正确,它应该像那样工作 – Sam

+0

不幸的是,它不起作用。实际上,Shanty_Mongo遵循Zend为它的库强制执行的目录命名转换,但我想它不起作用,因为它不支持命名空间。我试图弄清楚如何使它工作(http://packages.zendframework.com/docs/latest/manual/en/zend.loader.html#zend.loader.load) – mobius

回答

4

Shanty_Mongo是一个“旧”下划线分隔的库,不使用名称空间。在ZF2中,风格与PSR-0标准相同,但具有命名空间(因此Shanty_Mongo将为Shanty\Mongo)。但是,例如,您可以使用类图加载这些旧式样。然后你可以在你的ZF2项目中使用下划线分隔的类。

我建议你为这个库创建一个模块,并把该模块放在./vendor(“提供第三方功能的模块”)。在这个模块中,可以创建以下目录结构(我假设模块的名称是ShantyMongo):

./vendor/ShantyMongo/ 
    library/ 
    Module.php 
    autoload_classmap.php 
    autoload_function.php 
    autoload_register.php 

图书馆是一个子模块的ShantyMongo git仓库。文件autoload_classmap.php是由ZF2存储库的bin目录内的php脚本classmap_generator.php创建的类映射。然后autoload_function.php可以像这样简单的东西:

<?php 
return function ($class) { 
    static $map; 
    if (!$map) { 
     $map = include __DIR__ . '/autoload_classmap.php'; 
    } 

    if (!isset($map[$class])) { 
     return false; 
    } 
    return include $map[$class]; 
}; 

而且autoload_register.php是这样的:

<?php 
spl_autoload_register(include __DIR__ . '/autoload_function.php'); 

要让ZF2应用程序知道你有这个模块,您需要填写module.php与ShantyMongo\Module类。这样的事情应该是足够了:

<?php 

namespace ShantyMongo; 

use Zend\Module\Consumer\AutoloaderProvider; 

class Module implements AutoloaderProvider 
{ 
    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\ClassMapAutoloader' => array(
       __DIR__ . '/autoload_classmap.php', 
      ) 
     ); 
    } 
} 

如果添加“ShantyMongo”在application.config.php你的模块阵列现在已经设置了自动加载机的内部ZF2这个第三方库。然后,您可以如下使用您的模型:

<?php 

namespace Dummy\Model; 

class Dummy extends Shanty_Mongo_Document { 
    public function setConnections ($connections) { 
    Shanty_Mongo::addConnections($connections); 
    } 
} 

因为ShantyMongo不使用名称空间,所以您不再使用该语句。