Іноді мені потрібно підключитися до різних баз даних, Mysql / Oracle і т. Д. Яка найкраща практика зробити це в Magento2
Іноді мені потрібно підключитися до різних баз даних, Mysql / Oracle і т. Д. Яка найкраща практика зробити це в Magento2
Відповіді:
Це офіційно не підтримується. Ми рухаємося до кращої модуляризації, а абоненти, що надходять через договори на обслуговування, обмежують API, який потрібно було б повторно застосувати (реалізацію за замовчуванням можна замінити за допомогою файлу di.xml), але це не буде простою роботою в Magento 2.0.0 . Ми рухаємось таким чином, але немає ЗНО, коли це буде "легко" зробити.
Наприклад, ви можете використовувати плагіни для перехоплення дзвінків до бази даних або викликів модулів; ви можете використовувати di.xml для заміни реалізацій за замовчуванням; і т. д. Тому є способи це зробити. (Люди іноді роблять це в М1.)
Це може бути не найкращою практикою, але в Magento 1 мені колись довелося підключитися до SQL Server, щоб отримати деяку інформацію. Я щойно створив з'єднання і помістив його в Helper, щоб мати змогу отримати його з будь-якої точки системи.
Я не бачу, чому ви не могли зробити те саме в Magento 2 (або принаймні спробувати)
ось як мені вдалося це зробити. Не знаю, чи правильно це, але це працює (тільки mysql):
app / тощо / 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',
),
),
...
додаток / код / Постачальник / Модуль / Модель / 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');
}
}
додаток / код / Постачальник / Модуль / Модель / 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');
}
}
додаток / код / Постачальник / Модуль / Модель / ResourceModel / Тест / 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');
}
}
Сподіваюся, це комусь допоможе.
Мікеле