私の頭に浮かぶ最も簡単なオプションは、現在のロケールを既存のテーブルクラスに挿入し、それに応じてデータベーステーブル名を設定することです。 (
// ...
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コードの前に
は、モデル層を含み、それは当然のロケールを設定した後:
これはの線に沿って何かを見ることができる、のは、既存のテーブルクラスがSomeSharedTable
と呼ばれることになると仮定しましょう例えばそれかもしれないが、あなたのブートストラップであること)、(この例では、我々は、エイリアステーブル名と一致していることを前提とし)、あなたのアプリケーション全体で使用しているエイリアスを設定します。LOCことが可能だということを考えると
\Cake\ORM\TableRegistry::config('SomeShared', [
'locale' => \Cake\I18n\I18n::locale()
]);
エールは何らかの理由でクラスに入れないかもしれませんが、いくつかの安全対策を実装する必要があります。私はその基本的な例をisset()
のように追加しました。誤って構成されたテーブルクラスがかなりの問題を引き起こす可能性があることを考えると、おそらくもっと洗練されたいくつかのチェックを追加することをお勧めします。
出典
2017-03-16 20:49:45
ndm
私の心に来る最初の質問は "_why_"ですか?なぜ、[**翻訳動作**](https://book.cakephp.org/3.0/en/orm/behaviors/translate.html)を使用するのではなく、そのようなことをするのでしょうか? – ndm
ご回答いただきありがとうございますが、テーブルが外部プログラムによって記入されているため、このソリューションを使用することはできません。たとえば、AとBはそれぞれ英語とポーランド語のデータで埋められています。ユーザーがウェブサイト – Annabelle
で操作を行う場合はC(en)とD(pl)でデータを追加する必要があります。レガシーデータベース。 – ndm