Извлеките уровень абстракции базы данных


Если это возможно, как я могу извлечь уровень абстракции базы данных для использования на сайте, не относящемся к Drupal?

 2
Author: kiamlaluno, 2012-11-03

2 answers

Хотите ли вы использовать API базы данных Drupal в том виде, в каком он существует в настоящее время, или вам просто нравится идея уровня абстракции PDO?

Если вы действительно пытаетесь вырваться из начальной загрузки и кода Drupal, ознакомьтесь с использованием объектов данных PHP (PDO):

Теперь, если вы просто хотите чтобы использовать 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-скрипт для использования определенных слоев, вы можете найти это полезным: -

 1
Author: Charlie Schliesser, 2012-11-03 19:37:40

Если вы хотите использовать код базы данных 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 файл. Вы можете заменить эту переменную статическим свойством класса базы данных.

 3
Author: kiamlaluno, 2012-11-04 01:19:51