Magento2:连接到外部非Magento数据库


9

有时我需要连接到不同的数据库,例如Mysql / Oracle等。在Magento2中执行此操作的最佳做​​法是什么

Answers:


4

官方没有对此提供支持。我们正在朝着更好的模块化方向发展,调用者通过服务合同来限制必须重新实现的API(可以使用di.xml文件替换默认实现),但是在Magento 2.0.0中这并不是一件容易的事。我们正在朝着这个方向前进,但是没有ETA时会“轻松”地做到这一点。

例如,您可以使用插件来拦截数据库调用或模块调用。您可以使用di.xml替换默认实现;等等。有很多方法可以做到。(人们有时在M1中这样做。)


2

这可能不是“最佳实践”,但是在Magento 1中,我曾经不得不连接到SQL Server以获得一些信息。我刚刚创建了连接并将其放在Helper中,以便能够从系统中的任何位置检索它。

我不明白为什么您不能在Magento 2中做同样的事情(或至少尝试一下)


2

这就是我设法做到的。不知道这是否是正确的方法,但是它有效(仅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',
    ),
  ),
...

应用/代码/供应商/模块/模型/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/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');
    }

}

希望它可以帮助某人。

米歇尔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.