Как структурировать модели для многоязычного использования - PullRequest
2 голосов
/ 04 октября 2011

Мне любопытно, какова хорошая структура модели для многоязычной среды.Я буду использовать базу данных продуктов в качестве примера ....

products
----------------------------------------------------------------
    products_id  |   products_customizer_id  |  date_added

products_description
----------------------------------------------------------------
    id  |  language_id  |  sku  |   description

Я хотел бы использовать геттеры и сеттеры ... Я застрял с вопросом о том, если у меня есть 1 модель продуктаили один для описания, а другой для продуктов?

update Чтобы было ясно, я вынужден использовать эту структуру базы данных ... Мне интересно, как настроить мои модели php... Я хотел бы иметь возможность ...

$product->setCustomizerId(4);
$product->setSku('BJKDJ423');
$product->setDescription('A spanish walrus');

$product->save();

И разумно ли сохранить каждое поле в каждой базе данных ... Это хорошая / плохая идея, почему или почему нет?

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Это не так уж и далеко от того, как я это сделаю ... Я склонен придерживаться формата, как, например, добавление всей таблицы с суффиксом _lang. Таким образом, у меня было бы 3 таблицы (используя InnoDB с внешними ключами для ссылочной целостности).

product
----------------------------------------------------------------
id | ... fields ...


language
----------------------------------------------------------------
id | ... fields ...


product_lang
----------------------------------------------------------------
language_id | product_id | name | description | ... etc ...

Я бы, вероятно, использовал строку ISO для идентификатора языка, например en-GB и автоинкрементный INT для идентификатора продукта. Первичный ключ в таблице product_lang будет составным ключом, созданным из полей language_id и product_id - таким образом вы избежите ненужного поля и любых ограничений INT, которые будут иметь.

В противном случае, да, вы в значительной степени там.

---- РЕДАКТИРОВАТЬ, ЧТОБЫ ОТКАЗАТЬ ОБНОВЛЕННЫЙ ВОПРОС ----

ОК - модель ...

Ваша модель должна отражать то, как вы будете использовать ее в деловом смысле, а не в смысле базы данных ... У меня была бы модель продукта, которая упаковывает данные, так как вы будете использовать ее, что-то вроде:

class MyProduct {
  private $_id;
  private $_sku;
  private $_name;
  private $_description;
  ...

  public function setId($iId) {
    $this->_id = (int) $iId;
  }

  public function getId() {
    return $this->_id;
  }

  ... and so on ...
}

Я бы установил язык в коннекторе базы данных, возможно, статически, если вы не часто меняете его, и пусть он вытягивает соответствующие данные из таблиц для распространения вашего объекта ... Я не большой сторонник активные записи - создавайте объектные модели, которые отображают бизнес-объекты, и базу данных, в которой данные хранятся в реляционной нормализованной форме. Используйте слой абстракции базы данных для преобразования одного в другой.

Помимо загрузки в настройках i18n

Как правило, я бы сохранял определенные переменные на уровне сайта в объекте приложения Singleton, который загружается на каждой странице, - именно там я бы сохранял идентификатор языка и все элементы загрузки приложения, поэтому он подключался к базе данных, начать сеанс, создать экземпляр объекта пользователя, назначить ему корзину и т. д. и т. д. - все, что используется глобально.

Так как язык будет установлен в этом объекте MyApp, и этот объект также будет содержать соединитель вашей базы данных - вы можете просто сделать так, чтобы этот объект автоматически устанавливал статический параметр MyDBConnector::setLang($sLang) при создании экземпляра.

Таким образом, чтобы запустить все приложение на любой странице, вам нужно просто сделать что-то вроде

require_once '/path/to/app.ini.php';
$oApp = MyApp::getInstance();
0 голосов
/ 04 октября 2011

Я использую полностью гибкую структуру модели, которая отображает описание, имя, название в качестве массива в моих моделях, таких как:

class Models_Product {

public function getNames(){ return $this->names; }
public function getName($lang){ return $this->name[$lang]; }

}

Стирать и повторять для всех свойств.

Примечание. Для настройки версии «setNames (array $ values)» мало пользы, только IMO следует создавать только setName ($ lang, $ value).

...