2

Zend Framework 2 声称有一个“随意使用”的设计,允许您轻松使用它的任何模块,而无需提交完整的堆栈。我需要一个好的数据库访问层,并且从在线文档和建议中,我喜欢 Zend\Db 的外观。我已将 Zend/Db 文件夹放在我的 /lib 目录中,但我无法让 PHP 识别 Zend\Db\Adapter\Adapter 类。当我尝试使用它时,我不断收到一个致命错误:

致命错误:在第 6 行的 /home/username/public_html/test.php 中找不到类“Zend\Db\Adapter\Adapter”

我尝试在我的 .htaccess 中设置 ZF2_PATH: SetEnv ZF2_PATH /home/username/public_html/lib/Zend

我尝试在我的代码中设置包含路径: set_include_path( $_SERVER['DOCUMENT_ROOT'] . '/lib' . PATH_SEPARATOR . get_include_path() );

我已经尝试显式加载和实例化 Zend\Loader:

require_once 'lib/Zend/Loader/StandardAutoloader.php';
$zendLoader = new Zend\Loader\StandardAutoloader();
$zendLoader->register();

这些都没有任何效果。我尝试明确要求 Zend/Db/Adapter/Adapter.php,这确实解决了我看到的错误,但随后我得到了它的一个依赖项的相同错误,所以这不是一个实际的解决方案。

我在这里做错了什么?ZF2 是否真的不是为这种模块化使用而设计的,还是我遗漏了什么?

编辑:我通过编写自己的自动加载函数来实现这一点:

function autoloader($class) {
    $path = explode('\\', $class);
    foreach ($path as $p) {
        $cp .= DIRECTORY_SEPARATOR . $p;
    }
    include __DIR__ . '/lib/' . $cp . '.php';
}
spl_autoload_register(autoloader);

这是有道理的——显然,如果我使用 db 模块而不使用框架的其余部分,我不能指望框架为我自动加载——除了我仍然不明白为什么手动加载 Zend\Loader没有解决问题。Zend\Loader 不是处理自动加载的重点吗?无论如何,我现在有一个可行的解决方案,但如果有更好的解决方案,我很想听听。

4

1 回答 1

6

我强烈建议您查看composer。它确实简化了管理大量现代 PHP 库之间的依赖关系以及自动加载。

例如,如果你开始你的项目,并且你知道你想要引入 zend-db,你会做这样的事情:

$ mkdir myproject
$ cd myproject
$ curl -s https://getcomposer.org/installer | php   
$ ./composer.phar require zendframework/zend-db:2.1.1

最后一行将导致作曲家开始行动。它将创建一个名为“vendor”的目录,其中保存了它管理的所有库。然后它将在那里检查 zend-db 的 2.1.1 版本,并设置您在项目中需要的 vendor/autoload.php。

然后你可以测试一下。像这样创建 myproject/index.php:

<?php
require_once "vendor/autoload.php";

$adapter = new Zend\Db\Adapter\Adapter(array(
   'driver' => 'Pdo_Sqlite',
   'database' => 'path/to/sqlite.db'
));

它只是工作。

稍后,如果您决定也需要 Zend\Mail,您只需:

$ ./composer.phar require zendframework/zend-mail:2.1.1

composer 将安装它以及一些依赖项,并确保它对自动加载器可用。

Composer 也不是 ZF 特定的。有一个完整的代码生态系统可供探索。 Packagist是一个很好的起点。

于 2013-02-09T21:32:44.260 回答