Parfois, je dois me connecter à différentes bases de données, Mysql / Oracle, etc. Quelle est la meilleure pratique pour le faire dans Magento2
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.)
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)
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