Как загрузить только модуль базы данных Zend Framework 2

Zend Framework 2 утверждает, что имеет конструкцию "использования по желанию", которая позволяет вам легко использовать любой из своих модулей без фиксации полного стека. Мне нужен хороший уровень доступа к базе данных, и из документов и рекомендаций в Интернете мне нравится внешний вид Zend\Db. Я поместил папку Zend/Db в каталог /lib, но у меня возникают проблемы с тем, чтобы PHP распознал класс Zend\Db\Adapter\Adapter. Я продолжаю получать фатальную ошибку, когда пытаюсь ее использовать:

Неустранимая ошибка: класс 'Zend\Db\Adapter\Adapter' не найден в /home/username/public_html/test.php в строке 6

Я попытался установить ZF2_PATH в моем.htaccess: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? В любом случае, сейчас у меня есть работоспособное решение, но если есть лучшее решение, я бы хотел услышать его.

1 ответ

Решение

Я настоятельно рекомендую вам проверить композитора. Это действительно упрощает управление зависимостями между кучей современных библиотек PHP, а также автозагрузку.

Например, если вы начинаете свой проект и знаете, что хотите использовать Zend-DB, вы должны сделать что-то вроде этого:

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

Эта последняя строка заставит композитора перейти в действие. Он создаст каталог с именем vendor, в котором будут храниться все библиотеки, которыми он управляет. Затем он проверит версию 2.1.1 файла zend-db и настроит 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 установит его вместе с парой зависимостей и убедится, что он доступен для автозагрузчика.

Композитор также не специфичен для ZF. Существует целая экосистема кода для изучения. Packagist - хорошее место для начала.

Другие вопросы по тегам