我想到的最简单的选择是将当前语言环境注入现有的表类,并相应地设置数据库表名。
假设您现有的表类将被调用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);
// ...
}
// ...
}
在您的应用程序代码涉及模型层之前,当然在它设置区域设置之后(例如,可能在您的引导程序中),配置您在整个应用程序中使用的别名(对于本示例,我们假设别名匹配表名):
\Cake\ORM\TableRegistry::config('SomeShared', [
'locale' => \Cake\I18n\I18n::locale()
]);
鉴于语言环境可能由于某种原因无法进入课程,您应该实施一些安全措施,我刚刚添加了基本isset()
检查以用于示例目的。鉴于错误配置的表类可能会导致一些问题,您可能希望添加一些更复杂的检查。