尝试在 ZF2 上弄湿我的脚,我偶然发现了我的第一个问题。在一个模块上说我想使用 Shanty_Mongo(一个连接到 MongoDb 的外部库)
所以我复制了库中的整个 Shanty 目录并创建了一个新的模型类:
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 添加一些内容以指向额外的库吗?
最佳答案
Shanty_Mongo
库是一个“旧的”下划线分隔库,不使用命名空间。在 ZF2 中,样式与 PSR-0 标准相同,但带有命名空间(因此 Shanty_Mongo
将是 Shanty\Mongo
)。但是,例如,您可以使用类映射很好地加载这些旧样式。然后您可以在 ZF2 项目中使用下划线分隔的类。
我建议您为这个库创建一个模块并将该模块放在 ./vendor
下(用于“提供第 3 方功能的模块”)。在这个模块中,你可以创建如下目录结构(我假设模块的名字是ShantyMongo):
./vendor/ShantyMongo/
library/
Module.php
autoload_classmap.php
autoload_function.php
autoload_register.php
该库是 Shanty-Mongo 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 应用程序知道您拥有此模块,您需要使用 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',
)
);
}
}
如果您将“ShantyMongo”添加到 application.config.php
中的模块数组,您现在已经为 ZF2 中的这个第 3 方库设置了自动加载器。然后,您可以按如下方式使用您的模型:
<?php
namespace Dummy\Model;
class Dummy extends Shanty_Mongo_Document {
public function setConnections ($connections) {
Shanty_Mongo::addConnections($connections);
}
}
因为 ShantyMongo 不使用 namespace ,所以您不再有那个 use 语句。
关于php - Zend Framework 2 库路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8026375/