我们有一个使用 2015 年数据的扩展。2016 年将有同样的游戏,没有结构变化。在扩展中,我希望有一个开关来更改数据库 extbase 从中获取数据。
任何输入如何实现这一目标?
谢谢你。
先前给出的关于“使用外部数据源”的答案只是解决了同一数据库中的映射方面,以及作为域驱动设计上下文中对象关系映射的变体的单表继承。
如果想使用不同的数据库连接甚至不同的 DBMS,给定的 Extbase 场景有三种可能性。
使用允许配置额外连接的数据库抽象层
dbal
配置一个替代连接并在您的源代码中使用它 - 有关详细信息,请参阅
DBAL 文档- 如果使用不同的 DBMS(如 Oracle 或 PostgreSQL)将会出现问题,但它如果两个数据库都基于 MySQL(或 MariaDB),应该可以正常工作Connection
对象,分别使用代表第二个数据库
的对象ConnectionPool
-有关详细信息,请参阅关于 Doctrine DBAL 的 TYPO3 文档使用VIEW
与第二个数据库不同的名称
VIEW
并在当前数据库中为该表提供不同的表名 - 这是一种解决方法,但可以确保对第二个数据库中的表的修改自动反映在数据库中VIEW
VIEW
具有不同名称的数据库重载类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);
有可能将您的模型映射到其他表,而不是按照惯例从模型名称派生的表。
例子:
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