2

我们有一个使用 2015 年数据的扩展。2016 年将有同样的游戏,没有结构变化。在扩展中,我希望有一个开关来更改数据库 extbase 从中获取数据。

任何输入如何实现这一目标?

谢谢你。

4

2 回答 2

5

先前给出的关于“使用外部数据源”的答案只是解决了同一数据库中的映射方面,以及作为域驱动设计上下文中对象关系映射的变体的单表继承。

如果想使用不同的数据库连接甚至不同的 DBMS,给定的 Extbase 场景有三种可能性。

  1. 使用允许配置额外连接的数据库抽象层

    • 直到 TYPO3 CMS 7,您必须安装系统扩展dbal配置一个替代连接并在您的源代码中使用它 - 有关详细信息,请参阅 DBAL 文档- 如果使用不同的 DBMS(如 Oracle 或 PostgreSQL)将会出现问题,但它如果两个数据库都基于 MySQL(或 MariaDB),应该可以正常工作
    • 使用 TYPO3 CMS 8,您可以使用 Doctrine DBAL,它允许为每个数据库表配置不同的连接。如果两个数据库中的表名相同,则需要获取Connection 对象,分别使用代表第二个数据库 的对象ConnectionPool-有关详细信息,请参阅关于 Doctrine DBAL 的 TYPO3 文档
  2. 使用VIEW与第二个数据库不同的名称

    • 在基础架构级别创建一个VIEW并在当前数据库中为该表提供不同的表名 - 这是一种解决方法,但可以确保对第二个数据库中的表的修改自动反映在数据库中VIEW
    • 利用上一篇文章中提到的 TypoScript 映射将您的域模型连接到VIEW具有不同名称的数据库
  3. 重载类Typo3DbBackend作为最后的手段

    • 此类负责在 Extbase 应用程序上下文中实际执行数据库查询

    • 在那里您可以集成一个策略模式以使用默认实现或使用您的自定义第二个数据库连接重载可以通过ext_localconf.php例如定义

        $extbaseObjectContainer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\Container\Container::class);
        $extbaseObjectContainer->registerImplementation(\TYPO3\CMS\Extbase\Persistence\Generic\Storage\BackendInterface::class, \TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbBackend::class);
      
于 2016-10-10T13:09:31.350 回答
0

有可能将您的模型映射到其他表,而不是按照惯例从模型名称派生的表。

例子:

plugin.tx_myextension {
    persistence {
        classes {
            Tx_MyExtension_Domain_Model_Person {
                mapping {
                    tableName = tt_address
                    recordType = Tx_MyExtension_Domain_Model_Person
                    columns {
                        birthday.mapOnProperty = dateOfBirth
                        street.mapOnProperty = thoroughfare
                    }
                }
            }
        }
    }
}

如果您只想切换表,则可以省略示例中的列映射。

可在文档中找到更多信息: https ://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/4-use-foreign-data-sources.html

于 2016-09-12T10:53:02.687 回答