Как загрузить только модуль базы данных 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 - хорошее место для начала.