CakePHP 3.3 表专用于基于所选语言的不同数据
CakePHP 3.3 tables dedicated for different data based on the selected language
我有一个关于 CakePHP 3.3 的非标准问题。假设我的数据库中有两个 table:A
和 B
(两者相同,第一个专用于第一种语言的数据,第二个专用于第二种语言的数据语言)。
我为 table A
正确编码了整个网站(table B
尚未使用)。此外,我实现了 .po
文件机制来切换界面语言。界面语言切换正确
怎样才能轻松塞table B
- 我不想在所有情况下都做出IF-ELSE
声明,因为网站越来越大,而且操作很多tableA已经收录了。如果语言 pl_PL
被选择为 en_US
(通过 .po
个文件)?
我想到的最简单的选择是将当前语言环境注入您现有的 table class,并让它相应地设置数据库 table 名称。
假设您现有的 table class 将被称为 SomeSharedTable
,这看起来类似于:
// ...
class SomeSharedTable extends Table
{
public function initialize(array $config)
{
if (!isset($config['locale'])) {
throw new \InvalidArgumentException('The `locale` config key is missing');
}
$table = 'en_table';
if ($config['locale'] === 'pl_PL') {
$table = 'pl_table';
}
$this->table($table);
// ...
}
// ...
}
在您的应用程序代码涉及模型层之前,当然在它设置区域设置之后(例如可能在您的 bootstrap 中),配置您在整个应用程序中使用的别名(对于此示例,我们假设别名与 table 名称匹配):
\Cake\ORM\TableRegistry::config('SomeShared', [
'locale' => \Cake\I18n\I18n::locale()
]);
考虑到语言环境可能出于某种原因无法进入 class,您应该实施一些安全措施,我刚刚添加了基本的 isset()
检查以供示例使用.鉴于错误配置 table class 可能会导致很多问题,您可能需要添加一些更复杂的检查。
我有一个关于 CakePHP 3.3 的非标准问题。假设我的数据库中有两个 table:A
和 B
(两者相同,第一个专用于第一种语言的数据,第二个专用于第二种语言的数据语言)。
我为 table A
正确编码了整个网站(table B
尚未使用)。此外,我实现了 .po
文件机制来切换界面语言。界面语言切换正确
怎样才能轻松塞table B
- 我不想在所有情况下都做出IF-ELSE
声明,因为网站越来越大,而且操作很多tableA已经收录了。如果语言 pl_PL
被选择为 en_US
(通过 .po
个文件)?
我想到的最简单的选择是将当前语言环境注入您现有的 table class,并让它相应地设置数据库 table 名称。
假设您现有的 table class 将被称为 SomeSharedTable
,这看起来类似于:
// ...
class SomeSharedTable extends Table
{
public function initialize(array $config)
{
if (!isset($config['locale'])) {
throw new \InvalidArgumentException('The `locale` config key is missing');
}
$table = 'en_table';
if ($config['locale'] === 'pl_PL') {
$table = 'pl_table';
}
$this->table($table);
// ...
}
// ...
}
在您的应用程序代码涉及模型层之前,当然在它设置区域设置之后(例如可能在您的 bootstrap 中),配置您在整个应用程序中使用的别名(对于此示例,我们假设别名与 table 名称匹配):
\Cake\ORM\TableRegistry::config('SomeShared', [
'locale' => \Cake\I18n\I18n::locale()
]);
考虑到语言环境可能出于某种原因无法进入 class,您应该实施一些安全措施,我刚刚添加了基本的 isset()
检查以供示例使用.鉴于错误配置 table class 可能会导致很多问题,您可能需要添加一些更复杂的检查。