Magento2: подключение к внешней не Magento DB

9

Иногда мне нужно подключиться к различным базам данных, Mysql / Oracle и т. Д. Как лучше всего это сделать в Magento2

Джесмонд Дарманин
источник

Ответы:

4

Это официально не поддерживается. Мы движемся к лучшей модульности, когда вызывающие абоненты приходят через контракты на обслуживание, чтобы ограничить API, который должен быть переопределен (реализацию по умолчанию можно заменить с помощью файла di.xml), но это не будет простой задачей в Magento 2.0.0 , Мы идем по этому пути, но нет ETA, когда это будет «легко» сделать.

Например, вы можете использовать плагины для перехвата вызовов базы данных или вызовов модулей; вы можете использовать di.xml для замены реализаций по умолчанию; и т.д. Так что есть способы сделать это. (Люди делают это в M1 иногда.)

Алан Кент
источник
2

Возможно, это не «лучшая практика», но в Magento 1 мне однажды пришлось подключаться к SQL Server, чтобы получить некоторую информацию. Я просто создал соединение и поместил его в помощник, чтобы иметь возможность получить его из любой точки системы.

Я не понимаю, почему вы не можете сделать то же самое в Magento 2 (или хотя бы попробовать)

Джош Пеннингтон
источник
2

Вот как мне удалось это сделать. Не знаю, правильно ли это, но это работает (только mysql):

приложение / и т.д. / env.php

...
  'db' => 
  array (
    'table_prefix' => '',
    'connection' => 
    array (
      'default' => 
      array (
        'host' => 'localhost',
        'dbname' => 'xxxx',
        'username' => 'yyyy',
        'password' => 'zzzz',
        'active' => '1',
      ),
      'myconnection' => 
      array (
        'host' => 'localhost',
        'dbname' => 'somedbname',
        'username' => 'xxxx',
        'password' => 'yyyy',
        'active' => '1',
      ),
    ),
  ),
  'resource' => 
  array (
    'default_setup' => 
    array (
      'connection' => 'default',
    ),
      'myconnection' =>
    array (
      'connection' => 'myconnection',
    ),
  ),
...

Приложение / код / ​​Vendor / модуль / модель / test.php

<?php
namespace Vendor\Module\Model;

use \Magento\Framework\Model\AbstractModel;

class Page extends AbstractModel
{
    const UID = 'uid'; 

    /**
     * Prefix of model events names
     *
     * @var string
     */
    protected $_eventPrefix = 'test'; // parent value is 'core_abstract'

    /**
     * Name of the event object
     *
     * @var string
     */
    protected $_eventObject = 'test'; // parent value is 'object'

    /**
     * Name of object id field
     *
     * @var string
     */
    protected $_idFieldName = self::UID; // parent value is 'id'

    /**
     * Initialize resource model
     *
     * @return void
     */
    protected function _construct()
    {
        $this->_init('Vendor\Module\Model\ResourceModel\Page');
    }

}

Приложение / код / ​​Vendor / модуль / модель / ResourceModel / test.php

<?php
namespace Vendor\Module\Model\ResourceModel;

use \Magento\Framework\Model\ResourceModel\Db\AbstractDb;

class Test extends AbstractDb
{

    protected $connectionName = 'myconnection';


    /**
     * Initialize resource model
     *
     * @return void
     */
    protected function _construct()
    {
        // Table Name and Primary Key column
        $this->_init('testtable', 'uid');
    }

}

Приложение / код / ​​Vendor / модуль / модель / ResourceModel / Test / Collection.php

<?php
namespace Vendor\Module\Model\ResourceModel\Test;

use \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;

class Collection extends AbstractCollection
{

    protected $_idFieldName = \Vendor\Module\Model\Test::UID;

    /**
     * Define resource model
     *
     * @return void
     */
    protected function _construct()
    {
        $this->_init('Vendor\Module\Model\Test', 'Vendor\Module\Model\ResourceModel\Test');
    }

}

Надеюсь, это кому-нибудь поможет.

Michele

Мишель Онгаро
источник