Magento2: Stellen Sie eine Verbindung zu einer externen Nicht-Magento-Datenbank her

9

Manchmal muss ich eine Verbindung zu verschiedenen Datenbanken, MySQL / Oracle usw. herstellen. Was ist die beste Vorgehensweise in Magento2?

Jesmond Darmanin
quelle

Antworten:

4

Dies wird offiziell nicht unterstützt. Wir streben eine bessere Modularisierung an, da Anrufer über Serviceverträge eingehen, um die API zu beschränken, die erneut implementiert werden müsste (die Standardimplementierung kann mithilfe der Datei di.xml ersetzt werden), aber in Magento 2.0.0 wird dies keine einfache Aufgabe sein . Wir bewegen uns in diese Richtung, aber keine ETA, wenn es "einfach" sein wird.

Sie können beispielsweise Plugins verwenden, um Datenbankaufrufe oder Modulaufrufe abzufangen. Sie können di.xml verwenden, um Standardimplementierungen zu ersetzen. usw. Es gibt also Möglichkeiten, dies zu tun. (Leute machen das manchmal in M1.)

Alan Kent
quelle
2

Es ist vielleicht keine "Best Practice", aber in Magento 1 musste ich einmal eine Verbindung zu einem SQL Server herstellen, um einige Informationen zu erhalten. Ich habe gerade die Verbindung erstellt und in einen Helper gestellt, um sie von überall im System abrufen zu können.

Ich verstehe nicht, warum Sie in Magento 2 nicht dasselbe tun konnten (oder es zumindest versuchen)

Josh Pennington
quelle
2

So habe ich es geschafft. Ich weiß nicht, ob es der richtige Weg ist, aber es funktioniert (nur 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');
    }

}

Hoffe es hilft jemandem.

Michele

Michele Ongaro
quelle