0

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

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

怎样才能轻松插表B——我不想IF-ELSE在所有情况下都发表声明,因为网站越来越大,表A中已经包含了很多操作。如果选择语言(通过文件),是否有可能以某种方式制作表A等于表的简单映射?Bpl_PLen_US.po

4

1 回答 1

2

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

假设您现有的表类将被调用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()检查以用于示例目的。鉴于错误配置的表类可能会导致一些问题,您可能希望添加一些更复杂的检查。

于 2017-03-16T20:49:45.933 回答