Mengakses objek i18n dari lingkup yang berbeda

10

Saya telah membangun kerangka kerja pribadi saya yang dimulai sebagai cara untuk mempelajari pola MVC dan sekarang telah berkembang menjadi sesuatu yang saya sukai lebih dari sebagian besar kerangka kerja di luar sana (yang mungkin karena saya menambahkan apa yang saya suka dan mengubah apa yang saya don suka tapi tetap saja) dan baik atau buruk saya menggunakannya di beberapa proyek.

Masalah yang saya miliki sekarang adalah bahwa saya tidak dapat menemukan cara yang layak untuk mengakses fungsionalitas i18n saya (bukan benar-benar i18n itu hanya terjemahan, tidak termasuk dukungan i18n penuh, setidaknya belum).

Cara kerjanya adalah saya menggunakan file konfigurasi sebagai file bahasa karena saya pikir itu akan cukup nyaman untuk menggunakan Configkelas untuk memuatnya karena dalam kerangka saya file konfigurasi dimuat secara dinamis - tidak dimuat kecuali diperlukan, Anda dapat melihat di sini

class Config {

    private static $settings = array();

    private function __construct() {

    }

    public static function load($file) {
        $path = PROJECT_PATH . '/config/' . $file . '.php';
        if (is_file($path)) {
            $settings = require($path);
        } else {
            throw new Exception('Configuration file [' . $file . '] doesn\'t exist', 500);
        }

        self::$settings[$file] = $settings;
        return true;
    }

    public static function get($file = null) {
        if ($file === null) {
            return self::$settings;
        } elseif (isset(self::$settings[$file]) || self::load($file)) {
            return self::$settings[$file];
        }
    }
}

Di mana satu file konfigurasi akan terlihat seperti ini

<?php return array(
    'setting0' => 'value',
    'setting1' => 'value',
    ....
);

Itu memungkinkan PHP untuk men-cache file-file itu dan memuatnya menjadi sangat cepat.

Sekarang ke terjemahan, seperti yang saya katakan itu adalah file konfigurasi dalam direktori yang berbeda bernama lang, tapi saya tidak bisa seenaknya memanggil Config::get('lang/en/myLangFile')setiap kali saya perlu mengakses terjemahan, jadi saya menemukan (menemukan, ya) Translationskelas, yang mewakili file terjemahan tunggal

class Translations {

    protected $data = [];

    public function __construct(array $translations) {
        $this->data = $translations;
    }

    public function __get($name) {
        return isset($this->data[$name]) ? $this->data[$name] : $name;
    }

}

Sekarang sangat nyaman dan indah untuk mengakses terjemahan

$t = new Translations([...]);

echo $t->translationKey;

Saya memiliki Langkelas yang digunakan untuk mengatur bahasa pilihan pengguna di antara hal-hal kecil lainnya jadi saya pikir saya akan menggunakannya sebagai pabrik untuk Translationskelas saya

class Lang {

    public static function get($file) {
        return new Translations(Config::get('lang/' . self::$lang . '/' . $file));
    }

}

Jadi sekarang yang harus saya lakukan untuk mendapatkan beberapa terjemahan adalah

$t = Lang::get('myLangFile');

echo $t->translationKey;

Jika Anda bertanya-tanya mengapa saya memiliki begitu banyak hal statis itu karena kelas-kelas ini tidak masuk akal untuk dipakai dan saya tidak suka pola desain tunggal, saya lebih suka memiliki "kelas statis" walaupun mereka tidak didukung dalam PHP (namun?).

Sejauh ini bagus, saya sudah mendapatkan terjemahannya, tetapi mari kita bahas masalahnya (akhirnya).

Ketika sebuah view di-render, kemungkinan besar akan mencetak beberapa teks kepada pengguna dan untuk itu saya perlu memiliki objek terjemahan yang tersedia di dalam, tetapi cukup merepotkan untuk meneruskannya dari controller karena saya harus pergi dan letakkan itu pada setiap metode dan itu akan menjadi neraka, apalagi jika saya melakukan itu maka beberapa controller lain memanggil tampilan yang sama tanpa terjemahan yang benar, hal-hal yang akan rusak, yang masuk akal tetapi menambah kompleksitas program.

Apa yang telah saya lakukan hingga saat ini adalah di atas setiap tampilan yang saya buat objek terjemahan saya

<?php $t = Lang::get('myLangFile') ?>

<div><?= $t->helloWorld ?></div>

Ini bekerja dan menjamin saya pandangan saya akan bekerja terlepas dari siapa yang memanggil mereka dan pada dasarnya hampir tidak ada biaya dalam hal kinerja karena instantiating Translationstidak akan menyalin array yang berisi informasi kecuali jika perubahan diperkenalkan karena kode dalam konstruktor hanya tugas, jadi saya kira tidak ada masalah dengan itu tetapi itu hanya mengganggu saya untuk beberapa alasan bahwa itu bukan hal yang benar untuk dilakukan.

Selain itu saya perlu menggunakan Translationskelas dalam model atau validator sesekali dan saya perlu instantiate di sana juga, jadi dalam satu eksekusi saya mungkin instantiating Translationsobjek yang sama beberapa kali. Untuk mengatasi masalah ini, saya harus mulai memasukkan benda-benda ke dalam registri dan saya pikir ini akan menjadi terlalu jauh.

Saya ingin melihat apa saja pemikiran tentang pendekatan ini karena saya bisa dibutakan oleh saya sendiri dan mungkin mendapatkan beberapa saran dan hal berguna. Terima kasih sebelumnya kepada siapa saja yang memilih untuk meluangkan waktu dengan masalah saya!

php_nub_qq
sumber

Jawaban:

0

<?php $t = Lang::get('myLangFile') ?>

<div><?= $t->helloWorld ?></div>

Ini berfungsi dan menjamin saya bahwa pandangan saya akan berfungsi terlepas dari siapa yang memanggil mereka dan pada dasarnya hampir tidak ada biaya dalam hal kinerja karena instantiating Terjemahan tidak akan menyalin array yang berisi informasi kecuali perubahan diperkenalkan karena kode dalam konstruktor hanyalah penugasan , jadi saya kira tidak ada masalah dengan itu tetapi itu hanya mengganggu saya untuk beberapa alasan bahwa itu bukan hal yang benar untuk dilakukan.

Saya mengerti maksud Anda ...
Saya pikir satu hal yang dapat mengganggu Anda adalah bahwa dengan menambahkan tanggung jawab memuat file bahasa, Anda melanggar pola desain Inversion of Control.
Karena itu, jika misalnya, 'myLangFile' Anda menjadi terlalu besar, dan Anda ingin membaginya menjadi 2 file terpisah, Anda tidak dapat melakukannya tanpa mengubah kode tampilan.
Bagaimana menurut anda?

duxtinto
sumber
1
Persis, itu benar-benar alasan yang sahih.
php_nub_qq
1
Betulkah? File bahasa tidak dapat menyertakan file lain dalam dirinya sendiri? Atau baca dari database?
svidgen
@viden itu desain yang sangat buruk
php_nub_qq