Magento2: se connecter à une base de données externe non Magento

9

Parfois, je dois me connecter à différentes bases de données, Mysql / Oracle, etc. Quelle est la meilleure pratique pour le faire dans Magento2

Jesmond Darmanin
la source

Réponses:

4

Ce n'est pas officiellement pris en charge. Nous nous dirigeons vers une meilleure modularisation, les appelants venant via des contrats de service pour restreindre l'API qui devrait être réimplémentée (l'implémentation par défaut peut être remplacée à l'aide du fichier di.xml), mais ce ne sera pas une tâche simple dans Magento 2.0.0 . Nous allons dans ce sens, mais pas d'ETA quand ce sera "facile" à faire.

Par exemple, vous pouvez utiliser des plugins pour intercepter les appels de base de données ou les appels de module; vous pouvez utiliser di.xml pour remplacer les implémentations par défaut; etc. Il y a donc des façons de le faire. (Les gens le font parfois en M1.)

Alan Kent
la source
2

Ce n'est peut-être pas la "meilleure pratique" mais dans Magento 1, j'ai dû une fois me connecter à un serveur SQL pour obtenir des informations. Je viens de créer la connexion et de la placer dans un assistant pour pouvoir la récupérer de n'importe où dans le système.

Je ne vois pas pourquoi vous ne pouviez pas faire la même chose dans Magento 2 (ou du moins l'essayer)

Josh Pennington
la source
2

c'est ainsi que j'ai réussi à le faire. Je ne sais pas si c'est la bonne façon mais ça marche (seulement 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 / Vendeur / Module / Modèle / 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');
    }

}

J'espère que cela aide quelqu'un.

Michele

Michele Ongaro
la source