如何避免整个多网站安装的 table 映射的 TYPO3 缓存?
How to avoid TYPO3 caching of table mapping for the whole multi website installation?
我有一个 TYPO3 安装 7.6.22,有不同的网站,每个都有自己的页面树。
在自己的扩展中,通常某个对象会持久化在 table tx_myextension_domain_model_name。
但是对于一个网站 A,我需要将这个对象映射到另一个网站 table A。所以我定义了错别字
config.tx_extbase.persistence.classes.MyVendor\Myextension\Domain\Model\Name.映射...
在一个单独的扩展中,特别是这个网站 A.
这可行,但目前无法同时进行两个映射。
如果我 - 清除所有缓存后 - 在网站 A 的前端加载插件,所有其他网站都有 table A 上的映射(而不是 tx_myextension_domain_model_name 上)。
如果我 - 清除所有缓存后 - 在其他网站之一的前端加载插件,此网站上一切正常,但网站 A 产生错误,因为某些进程无法使用默认设置table tx_myextension_domain_model_name.
很明显,映射配置是为整个安装缓存的,而不是在每个网站的基础上缓存的。
这是错误还是功能?有解决办法吗?
在一次安装中,您只能使用一组 类/PHP 源/扩展。
如果你想要不同的行为,你需要插入条件。你可能会在你的控制器中拆分使用,你可能会做一些改变来将它拆分到你的存储库中。但我认为这可能非常复杂。
可能最干净的解决方案是使用另一个数据域及其自己的数据记录。
是否应该只用另一个 table 来分隔条目?
为什么不使用 pid
字段来为不同的页面定义不同的存储?
如果它需要不同的源代码,那么"simple"复制这个扩展并重命名它。
编辑:
您还可以为每个网站使用不同的域模型,因此每个域都有不同的存储库和 tables。
将您的主模型扩展到新模型 (Model1DomainB extends Model1()
) 并复制 ext_tables.sql
中的 sql 以创建新的 table (tx_extension_domain_model_model1domainb
) .
现在为您的插件设置一个设置以定义一个可切换的值:
plugin.tx_extension.settings.domain = b
并且在您的控制器中,您可以进行切换以使用正确的存储库:
switch ($this->settings['domain']) {
case 'b':
$models = $this->model1DomainBRepository->findAll();
case 'c':
$models = $this->model1DomainCRepository->findAll();
case 'd':
$models = $this->model1DomainDRepository->findAll();
default:
$models = $this->model1Repository->findAll();
break;
}
在TYPO3 forge中看看这个问题,我的评论在最底部。
https://forge.typo3.org/issues/75399#change-337355
显然:您需要禁用 属性 映射器缓存。
在您的 AdditionalConfiguration.php 文件中添加以下内容。
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_datamapfactory_datamap']['backend'] = 'TYPO3\CMS\Core\Cache\Backend\NullBackend';
这可能会降低您的性能,但我认为不会那么多。但是您将能够使用(本地)TypoScript 设置为不同的站点配置不同的映射。
我有一个 TYPO3 安装 7.6.22,有不同的网站,每个都有自己的页面树。
在自己的扩展中,通常某个对象会持久化在 table tx_myextension_domain_model_name。
但是对于一个网站 A,我需要将这个对象映射到另一个网站 table A。所以我定义了错别字 config.tx_extbase.persistence.classes.MyVendor\Myextension\Domain\Model\Name.映射... 在一个单独的扩展中,特别是这个网站 A.
这可行,但目前无法同时进行两个映射。
如果我 - 清除所有缓存后 - 在网站 A 的前端加载插件,所有其他网站都有 table A 上的映射(而不是 tx_myextension_domain_model_name 上)。
如果我 - 清除所有缓存后 - 在其他网站之一的前端加载插件,此网站上一切正常,但网站 A 产生错误,因为某些进程无法使用默认设置table tx_myextension_domain_model_name.
很明显,映射配置是为整个安装缓存的,而不是在每个网站的基础上缓存的。 这是错误还是功能?有解决办法吗?
在一次安装中,您只能使用一组 类/PHP 源/扩展。
如果你想要不同的行为,你需要插入条件。你可能会在你的控制器中拆分使用,你可能会做一些改变来将它拆分到你的存储库中。但我认为这可能非常复杂。
可能最干净的解决方案是使用另一个数据域及其自己的数据记录。
是否应该只用另一个 table 来分隔条目?
为什么不使用 pid
字段来为不同的页面定义不同的存储?
如果它需要不同的源代码,那么"simple"复制这个扩展并重命名它。
编辑:
您还可以为每个网站使用不同的域模型,因此每个域都有不同的存储库和 tables。
将您的主模型扩展到新模型 (Model1DomainB extends Model1()
) 并复制 ext_tables.sql
中的 sql 以创建新的 table (tx_extension_domain_model_model1domainb
) .
现在为您的插件设置一个设置以定义一个可切换的值:
plugin.tx_extension.settings.domain = b
并且在您的控制器中,您可以进行切换以使用正确的存储库:
switch ($this->settings['domain']) {
case 'b':
$models = $this->model1DomainBRepository->findAll();
case 'c':
$models = $this->model1DomainCRepository->findAll();
case 'd':
$models = $this->model1DomainDRepository->findAll();
default:
$models = $this->model1Repository->findAll();
break;
}
在TYPO3 forge中看看这个问题,我的评论在最底部。
https://forge.typo3.org/issues/75399#change-337355
显然:您需要禁用 属性 映射器缓存。 在您的 AdditionalConfiguration.php 文件中添加以下内容。
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_datamapfactory_datamap']['backend'] = 'TYPO3\CMS\Core\Cache\Backend\NullBackend';
这可能会降低您的性能,但我认为不会那么多。但是您将能够使用(本地)TypoScript 设置为不同的站点配置不同的映射。