Php 如何构造多语言使用的模型
我很好奇对于多语言环境来说,什么是好的模型结构。我将使用产品数据库作为示例Php 如何构造多语言使用的模型,php,mysql,internationalization,multilingual,Php,Mysql,Internationalization,Multilingual,我很好奇对于多语言环境来说,什么是好的模型结构。我将使用产品数据库作为示例 products ---------------------------------------------------------------- products_id | products_customizer_id | date_added products_description ---------------------------------------------------------
products
----------------------------------------------------------------
products_id | products_customizer_id | date_added
products_description
----------------------------------------------------------------
id | language_id | sku | description
我想使用getter和setter。。。我的问题是,我应该有一个产品模型,还是一个用于描述,另一个用于产品
更新
说清楚一点,我被迫使用这个数据库结构。。。我想知道如何设置我的php模型。。。我希望能够做到
$product->setCustomizerId(4);
$product->setSku('BJKDJ423');
$product->setDescription('A spanish walrus');
$product->save();
并让它智能地保存每个数据库中的每个字段。。。。这是一个好/坏主意,为什么?为什么不?这与我的做法相差不远。。。我倾向于坚持一种格式,尽管我喜欢所有特定语言的表格都加上
\u lang
。所以我有3个表(使用带外键的InnoDB实现引用完整性)
我可能会使用ISO字符串作为语言id,例如,en GB
和产品id的自动递增整数。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设置中加载时将其放在一旁
一般来说,我会将某些站点范围的变量存储在一个加载到每个页面上的单例应用程序对象中,在那里我会存储语言id和所有应用程序启动信息,这样它就会连接到数据库,启动会话,实例化一个用户对象,给他们分配一辆购物车等等——所有全球使用的东西
由于语言将在该MyApp
对象中设置,并且该对象还将保存数据库连接器-您只需让该对象在实例化时自动设置静态MyDBConnector::setLang($sLang)
参数即可
这样,要在任何页面上启动整个应用程序,只需执行以下操作
require_once '/path/to/app.ini.php';
$oApp = MyApp::getInstance();
我使用完全灵活的模型结构,将描述、名称、标题作为数组公开在我的模型中,例如:
class Models_Product {
public function getNames(){ return $this->names; }
public function getName($lang){ return $this->name[$lang]; }
}
清洗外皮并重复所有属性
注意:设置“setNames(array$values)”版本没有什么用处,IMO只能创建一个setName($lang$value)。不,他说的是模型,而不是数据库结构
class Models_Product {
public function getNames(){ return $this->names; }
public function getName($lang){ return $this->name[$lang]; }
}