Как вставить соединение с базой данных в пользовательскую службу?

У меня есть настраиваемый модуль, который извлекает данные из нескольких разных внешних баз данных, которые были определены как соединения в settings.php. Текущая настройка включает в себя серию контроллеров, у которых есть служба, которую я создал, с помощью DataAccess. У моей службы DataAccess есть несколько методов, которые принимают параметр $schema, и на основании этого я использую следующее каждый раз:

$connection = Database::getConnection('default', $schema);

Затем я могу запросить каждую базу данных по мере необходимости с этой настройкой. Я подумал о том, чтобы вводить базу данных в свою службу из контейнера Drupal, но тогда мне понадобился бы базовый класс, такой как метод создания ControllerBase, чтобы получить эту услугу в первую очередь. Каким будет правильный способ сделать это, поскольку он не является контроллером - я бы использовал здесь другой базовый класс? Я новичок в разработке Drupal 8 и стараюсь, чтобы я следил за лучшими практиками, но в то же время я не хочу перегружать вещи.

Любые советы?

4 голоса | спросил Ian Carnaghan 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 03 Sep 2016 20:42:08 +0300 2016, 20:42:08

3 ответа


5

Как прокомментировал другой ответ, ответ здесь, вероятно, вы не можете.

API-интерфейс базы данных не полностью преобразован для использования служб. Я пытался это сделать в течение некоторого времени, в https://www.drupal.org/node/1811730 , но не удалось, и другие не сделали.

Итак, на данный момент вам нужно использовать статические методы. Лучшее, что вы можете сделать, это обернуть его в методе или другой службе, которая делает это только для упрощения насмешек, когда вы хотите писать модульные тесты.

ответил Berdir 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 04 Sep 2016 09:57:42 +0300 2016, 09:57:42
4

Вы не можете вводить Drupal\Core\Database\Database , это контейнер статических функций, констант и & переменные для основных функций базы данных.

Если вы хотите ввести объект Connection, это возможно и больше похоже на то, что вы хотите (если только вы не есть сценарий, в котором setting.php является динамическим, и все возможные значения $schema не могут быть известны).

Вы можете следовать примеру Drupal с классом по умолчанию @database в core.services.yml :

  database:
    class: Drupal\Core\Database\Connection
    factory: Drupal\Core\Database\Database::getConnection
    arguments: [default]

В mymodule.services.yml вы можете определить фабрику /аргументы для каждого вашего подключения к базе данных, плюс ваш DataAccess с введенными соединениями.

services:
  mymodule.database_schema:
    class: Drupal\Core\Database\Connection
    factory: Drupal\Core\Database\Database::getConnection
    arguments: [default, schema]
  mymodule.database_schema2:
    class: Drupal\Core\Database\Connection
    factory: Drupal\Core\Database\Database::getConnection
    arguments: [default, schema2]
  mymodule.data_access:
    class: Drupal\mymodule\DataAccess
    arguments: ['@mymodule.database_schema', '@mymodule.database_schema2']

Оттуда вы можете сохранить соединения с базой данных в конструкторе DataAccess и ссылаться на них, как требуется DataAccess.

ответил Shawn Conn 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 03 Sep 2016 23:01:41 +0300 2016, 23:01:41
0

В этот момент я использую этот код для ввода службы базы данных:

*. Services.yml

services:
  onlyone:
    class: Drupal\onlyone\OnlyOne
    arguments: ['@entity_type.manager', '@database', '@language_manager']

Drupal \ OnlyOne \ OnlyOne

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Language\LanguageManagerInterface;

  /**
   * {@inheritdoc}
   */
  public function __construct(EntityTypeManagerInterface $entity_type_manager, Connection $connection, LanguageManagerInterface $language_manager) {
    $this->entityTypeManager = $entity_type_manager;
    $this->connection = $connection;
    $this->languageManager = $language_manager;
  }
ответил Adrian Cid Almaguer 6 WedEurope/Moscow2017-12-06T19:31:48+03:00Europe/Moscow12bEurope/MoscowWed, 06 Dec 2017 19:31:48 +0300 2017, 19:31:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132