Magento2: Conecte-se a um banco de dados externo não Magento

9

Às vezes, preciso conectar-me a diferentes bancos de dados, Mysql / Oracle etc. Qual é a melhor prática para fazer isso no Magento2

Jesmond Darmanin
fonte

Respostas:

4

Isso não é oficialmente suportado. Estamos caminhando para uma melhor modularização, com os chamadores entrando através de contratos de serviço para restringir a API que precisaria ser reimplementada (a implementação padrão pode ser substituída usando o arquivo di.xml), mas não será uma tarefa simples no Magento 2.0.0 . Estamos nos movendo dessa maneira, mas não há ETA quando será "fácil" de fazer.

Por exemplo, você pode usar plug-ins para interceptar chamadas de banco de dados ou de módulo; você pode usar o di.xml para substituir implementações padrão; etc. Portanto, existem maneiras de fazê-lo. (As pessoas fazem isso no M1 às vezes.)

Alan Kent
fonte
2

Pode não ser a "melhor prática", mas no Magento 1 tive que me conectar a um SQL Server para obter algumas informações. Acabei de criar a conexão e colocá-la em um Helper para poder recuperá-la de qualquer lugar do sistema.

Não vejo por que você não poderia fazer o mesmo no Magento 2 (ou pelo menos tentar)

Josh Pennington
fonte
2

foi assim que consegui fazê-lo. Não sei se é a maneira correta, mas funciona (somente mysql):

app / etc / 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',
    ),
  ),
...

app / code / Vendor / Module / Model / 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');
    }

}

app / code / Vendor / Module / Model / 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');
    }

}

app / code / Vendor / Module / Model / 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');
    }

}

Espero que ajude alguém.

Michele

Michele Ongaro
fonte