3

试图在 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);
  }
}

(setConnections() 将由 DI 使用,如果我理解得很好的话)

这似乎找不到 Shanty_Mongo_Document。我应该向 application.config.php 添加一些内容以指向额外的库吗?

4

1 回答 1

4

该库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 存储库目录中的classmap_generator.phpphp脚本创建的类映射。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 应用程序知道你有这个模块,你需要在 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 中的这个第 3 方库设置了自动加载器。然后,您可以按如下方式使用您的模型:

<?php

namespace Dummy\Model;

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

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

于 2011-12-13T09:23:22.090 回答