如何仅加载Zend Framework 2数据库模块


How do I load Zend Framework 2 database module only

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

我已尝试在代码中设置include路径: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的重点吗?不管怎样,我现在有一个可行的解决方案,但如果有更好的解决方案我很乐意听到。

我强烈建议您查看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是一个很好的起点。