Извлеките уровень абстракции базы данных
Если это возможно, как я могу извлечь уровень абстракции базы данных для использования на сайте, не относящемся к Drupal?
2 answers
Хотите ли вы использовать API базы данных Drupal в том виде, в каком он существует в настоящее время, или вам просто нравится идея уровня абстракции PDO?
Если вы действительно пытаетесь вырваться из начальной загрузки и кода Drupal, ознакомьтесь с использованием объектов данных PHP (PDO):
- http://www.php.net/manual/en/book.pdo.php
- http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
Теперь, если вы просто хотите чтобы использовать API базы данных Drupal для работы с базой данных за пределами базы данных Drupal (но в пользовательском модуле или в пользовательском файле .php, который загружает базу данных), вы можете очень легко сделать это, переключив базы данных через db_set_active()
. Ты бы бросил что-нибудь подобное в свой settings.php файл:
<?php
$databases = array();
$databases['default']['default'] = array(
// Drupal's credentials here...
);
$databases['my_other_db']['default'] = array(
// My other database credentials here...
);
?>
А затем вы активировали бы его через:
<?php
db_set_active('my_other_db'); // Use my_other_db
// do stuff using Drupal 7's awesome database API
db_set_active(); // Go back to Drupal's db.
?>
Я написал сообщение в блоге, в котором рассказывается о том, как загрузить Drupal в отдельный PHP-скрипт для использования определенных слоев, вы можете найти это полезным: -
Если вы хотите использовать код базы данных Drupal на веб-сайте без начальной загрузки Drupal, вам понадобятся следующие файлы:
- включает в себя/базу данных/database.inc
- включает в себя/базу данных/sqlite/database.inc
- включает в себя/базу данных/mysql/database.inc
- включает в себя/базу данных/pgsql/database.inc
Код в этих файлах необходимо изменить, как:
-
В коде используется константа DRUPAL_ROOT. Вы могли бы удалить код, используя это константа и замените ее кодом, который автоматически загружает включаемый файл, содержащий класс. Например, в следующем коде используется
DRUPAL_ROOT
, потому что Drupal не может использовать свой реестр кодов, пока не будет активировано подключение к базе данных, так как его реестр кодов использует таблицу базы данных.// We cannot rely on the registry yet, because the registry requires an // open database connection. $driver_class = 'DatabaseConnection_' . $driver; require_once DRUPAL_ROOT . '/includes/database/' . $driver . '/database.inc'; $new_connection = new $driver_class(self::$databaseInfo[$key][$target]); $new_connection->setTarget($target); $new_connection->setKey($key);
Это может быть переписано следующим образом, если вы зарегистрируете свою собственную функцию с помощью spl_autoload_register().
$driver_class = 'DatabaseConnection_' . $driver; $new_connection = new $driver_class(self::$databaseInfo[$key][$target]); $new_connection->setTarget($target); $new_connection->setKey($key);
Функции используют глобальный
$databases
, который обычно определяется в тот settings.php файл. Вы можете заменить эту переменную статическим свойством класса базы данных.