Tôi đã xây dựng một khung công tác cá nhân của mình bắt đầu như là một cách để tìm hiểu mô hình MVC và bây giờ đã phát triển thành một thứ mà tôi thích hơn hầu hết các khung công tác ngoài đó (có lẽ là vì tôi thêm những gì tôi thích và thay đổi những gì tôi không 'thích nhưng tuy nhiên) và tốt hay xấu tôi sử dụng nó trong một số dự án.
Vấn đề tôi gặp phải bây giờ là tôi không thể tìm ra cách tốt để truy cập chức năng i18n của mình (nó không thực sự là i18n, đó chỉ là bản dịch, không bao gồm hỗ trợ i18n đầy đủ, ít nhất là chưa có).
Cách thức hoạt động là tôi sử dụng các tệp cấu hình làm tệp ngôn ngữ vì tôi cho rằng sẽ rất thuận tiện khi sử dụng Config
lớp để tải chúng vì trong tệp cấu hình khung của tôi được tải động - không được tải trừ khi cần, bạn có thể xem lướt qua tại đây
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];
}
}
}
Trường hợp một tệp cấu hình duy nhất trông giống như thế này
<?php return array(
'setting0' => 'value',
'setting1' => 'value',
....
);
Điều đó cho phép PHP lưu trữ các tệp đó và tải chúng trở nên rất nhanh.
Bây giờ đối với các bản dịch, như tôi đã nói chúng là các tệp cấu hình trong một thư mục khác có tên lang
, nhưng tôi không thể cứ gọi điện Config::get('lang/en/myLangFile')
mỗi khi tôi cần truy cập một bản dịch, vì vậy tôi đã phát minh ra (phát minh, huh) Translations
lớp, đại diện cho một tập tin dịch duy nhất
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;
}
}
Bây giờ nó là siêu thuận tiện và đẹp để truy cập các bản dịch
$t = new Translations([...]);
echo $t->translationKey;
Tôi có một Lang
lớp được sử dụng để thiết lập ngôn ngữ ưa thích của người dùng trong số những thứ nhỏ nhặt khác vì vậy tôi nghĩ rằng tôi sẽ sử dụng nó như một nhà máy cho Translations
các lớp học của mình
class Lang {
public static function get($file) {
return new Translations(Config::get('lang/' . self::$lang . '/' . $file));
}
}
Vì vậy, bây giờ tất cả những gì tôi phải làm để lấy một số bản dịch là
$t = Lang::get('myLangFile');
echo $t->translationKey;
Trong trường hợp bạn đang tự hỏi tại sao tôi có quá nhiều công cụ tĩnh bởi vì các lớp này không có ý nghĩa để được khởi tạo và tôi không thích mẫu thiết kế đơn lẻ, tôi thích có "các lớp tĩnh" mặc dù chúng không được hỗ trợ trong PHP (chưa?).
Cho đến nay rất tốt, tôi đã có các bản dịch đi, nhưng chúng ta hãy đi đến vấn đề (cuối cùng).
Khi một khung nhìn được hiển thị, rất có thể nó sẽ in một số văn bản ra cho người dùng và vì vậy tôi cần phải có một đối tượng dịch có sẵn nhưng điều đó khá bất tiện khi phải chuyển nó từ bộ điều khiển vì tôi sẽ phải đi và Đặt điều đó vào từng phương thức và đó sẽ là địa ngục, hơn nữa nếu tôi làm điều đó thì một số bộ điều khiển khác gọi cùng một chế độ xem mà không có bản dịch chính xác, các đối tượng sẽ bị phá vỡ, điều này có ý nghĩa nhưng làm tăng thêm sự phức tạp cho chương trình.
Những gì tôi đã làm cho đến thời điểm này là trên cùng của mỗi chế độ xem tôi xây dựng đối tượng dịch thuật của mình
<?php $t = Lang::get('myLangFile') ?>
<div><?= $t->helloWorld ?></div>
Điều này hoạt động và đảm bảo cho tôi các quan điểm của tôi sẽ hoạt động bất kể ai gọi chúng và về cơ bản gần như không tốn gì về hiệu suất vì việc tạo ra một Translations
bản sao sẽ không sao chép mảng chứa thông tin trừ khi thay đổi được đưa ra vì mã trong hàm tạo chỉ là một phép gán, Vì vậy, tôi đoán rằng không có vấn đề gì với điều đó nhưng nó chỉ làm phiền tôi vì một số lý do rằng đó không phải là điều chính xác để làm.
Hơn nữa Translations
, thỉnh thoảng tôi sẽ cần sử dụng một lớp trong một mô hình hoặc trình xác nhận hợp lệ và tôi cũng cần phải khởi tạo nó ở đó, vì vậy trong một lần thực hiện, tôi có thể khởi tạo cùng một Translations
đối tượng nhiều lần. Để giải quyết vấn đề này, tôi sẽ cần bắt đầu đưa các đối tượng đó vào sổ đăng ký và tôi nghĩ rằng điều này sẽ trở nên quá xa.
Tôi muốn xem một số suy nghĩ về phương pháp này là gì khi tôi có thể bị mù bởi chính mình như vậy và có thể nhận được một số lời khuyên và công cụ hữu ích. Cảm ơn trước cho bất cứ ai chọn dành thời gian của họ với vấn đề của tôi!