CakePHP 3.3表专用于基于所选语言的不同数据

时间:2017-03-13 10:24:25

标签: cakephp internationalization po cakephp-3.3

我对CakePHP 3.3有一个非标准的问题。让我们假设在我的数据库中我有两个表:AB(两者都相同,第一个专用于第一语言的数据,第二个专用于第二语言的数据)。

我正确编码了整个网站A(表B尚未使用)。另外,我实现了.po文件mechanizm来切换接口的语言。接口的语言正确切换。

如何轻松插入表B - 我不想在所有情况下都发出IF-ELSE语句,因为网站变得越来越大,并且表A中已经包含了许多操作。如果A选择语言B(通过pl_PL文件),是否有可能以某种方式制作表en_US等于表.po的简单映射?< / p>

1 个答案:

答案 0 :(得分:1)

我想到的最简单的选择是将当前的语言环境注入现有的表类,并相应地设置数据库表名。

假设您的现有表类将被称为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);

        // ...
    }

    // ...
}

在您的appplication代码涉及模型层之前,在设置了当前的语言环境(例如可能在您的引导程序中)之后,配置您在整个应用程序中使用的别名(对于此示例,我们假设别名与表名匹配):

\Cake\ORM\TableRegistry::config('SomeShared', [
    'locale' => \Cake\I18n\I18n::locale()
]);

鉴于区域设置可能因某种原因无法进入课堂,您应该实施一些安全措施,我刚刚添加了基本的isset()检查以用于示例目的。鉴于错误配置的表类可能会导致一些问题,您可能希望添加一些更复杂的检查。