试图在ZF2上弄湿我,我偶然发现了我的第一个问题。在模块上说我想使用Shanty_Mongo(一个外部库连接到MongoDb)
所以我在库上复制了整个Shanty目录并创建了一个新的Model类:
namespace Dummy\Model;
use Shanty\Mongo\Document;
class Dummy extends Shanty_Mongo_Document {
public function setConnections( $connections ) {
Shanty_Mongo::addConnections($connections);
}
}
(如果我理解的话,DI将使用setConnections())
这似乎无法找到Shanty_Mongo_Document。我应该在application.config.php中添加一些内容来指向额外的库吗?
答案 0 :(得分:4)
图书馆Shanty_Mongo
是一个" old"在不使用命名空间的情况下强调分隔库。在ZF2中,样式与PSR-0标准相同,但具有名称空间(因此Shanty_Mongo
将为Shanty\Mongo
)。但是,您可以使用类图加载这些旧样式。然后,您可以在ZF2项目中使用下划线分隔的类。
我建议您为此库创建一个模块,并将该模块放在./vendor
下(对于"提供第三方功能的模块")。在此模块中,您可以创建以下目录结构(我假设模块的名称是ShantyMongo):
./vendor/ShantyMongo/
library/
Module.php
autoload_classmap.php
autoload_function.php
autoload_register.php
该库是Shanty-Mongo git存储库的子模块。文件autoload_classmap.php
是由ZF2存储库的classmap_generator.php
目录中的php脚本bin
创建的类映射。然后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应用程序知道您有此模块,您需要使用ShantyMongo\Module
类填充module.php。这样的事情就足够了:
<?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',
)
);
}
}
如果你添加&#34; ShantyMongo&#34;在application.config.php
中的模块数组中,您现在已经为ZF2中的第三方库设置了自动加载器。然后,您可以按如下方式使用您的模型:
<?php
namespace Dummy\Model;
class Dummy extends Shanty_Mongo_Document {
public function setConnections ($connections) {
Shanty_Mongo::addConnections($connections);
}
}
由于ShantyMongo不使用名称空间,因此您不再使用该语句。