php - Zend Framework 2 库路径

标签 php zend-framework zend-framework2

尝试在 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/

相关文章:

php - Laravel: SQLSTATE[HY000] [2054] 服务器请求客户端未知的身份验证方法

php - MediaWiki 1.25.2 升级脚本从 1.10 失败

php - zend框架中没有冗余的模块化结构(不相互依赖)

php - magento 中各州的销售报告

mongodb - Zend Framework 2 + Doctrine ODM, "The Class was not found in the chain configured namespaces"错误?

zend-framework2 - 在另一个 Controller zend 框架 2 中调用函数

php - 如何使用带有where条件的表单数据的select语句将数据插入数据库

php - Laravel 5.4 Artisan Migrate 失败并调用未定义的方法 dispatch()

php - 从多对多表中返回缺失的结果

doctrine-orm - 不使用指定配置的 Doctrine 迁移