Rob Allen在Getting Started with Zend Framework 2的专辑收集教程中对ZF2进行了很好的介绍。在他的模块中,模型看起来像这样:
// ...
class Albums
{
public $id;
public $artist;
public $title;
public function exchangeArray($data)
{
$this->id = ( isset($data['id']) ? $data['id'] : null );
$this->artist = ( isset($data['artist']) ? $data['artist'] : null );
$this->title = ( isset($data['title']) ? $data['title'] : null );
}
// ...
如果我继续为我的领带系列构建一个模块,我的模型看起来像这样:
// ...
class Neckties
{
public $tieID;
public $tieColor;
public $tieDesigner;
public function exchangeArray($data)
{
$this->tieID = ( isset($data['tieID']) ? $data['tieID'] : null );
$this->tieColor = ( isset($data['tieColor']) ? $data['tieColor'] : null );
$this->tieDesigner = ( isset($data['tieDesigner']) ? $data['tieDesigner'] : null );
}
// ...
对于我的Insect系列,我的模型看起来像这样:
// ...
class Insects
{
public $bugID;
public $bugSpecies;
public $bugLatinName;
public function exchangeArray($data)
{
$this->bugID = ( isset($data['bugID']) ? $data['bugID'] : null );
$this->bugSpecies = ( isset($data['bugSpecies']) ? $data['bugSpecies'] : null );
$this->bugLatinName = ( isset($data['bugLatinName']) ? $data['bugLatinName'] : null );
}
// ...
你可以从这个模式推断我的FancyShoelaces系列,我的BathtubToys系列,我的CommemorativeSpoons系列,我的FoodsThatLookLikePresidents系列等等。
开发这样的模型在两个方面效率很低:1)每次我创建一个模型来从不同的表中绘制数据时,我只是复制相同的代码并更改字段和变量名称; 2)每当我更改或添加表字段时,我都必须返回并修改我的ZF2代码。此外,我总是冒着在标签上出错或完全忽略整个领域的风险。
我正在将CMS迁移到ZF2,在我当前的项目中,我使用一个全局函数,它根据通过参数识别的任何表的字段名声明和填充变量:
global $query_table_names;
$query_table_names = "SELECT column_name, column_type, data_type FROM information_schema.columns ";
$query_table_names .= "WHERE table_name = '$table_name' AND table_schema<>'information_schema'";
$columns = mysqli_query($mysqli, $query_table_names) or die('Query failed: ' . mysqli_error());
while ($column = mysqli_fetch_array($columns, MYSQL_ASSOC)) {
$column_name = $column['column_name'];
$data_type = $column['data_type'];
$$column_name = ( isset($data[$column_name]) ? $data[$column_name] : null );
}
我想在ZF2中创建一个这种方法的传真,但作为一个ZF2新手,我不知道如何正确编写代码或在哪里放置它。如果您有任何建议或指导,我将不胜感激。
答案 0 :(得分:1)
这是Data Mapper
设计模式的实现。您可以查看Wikipedia了解更多相关信息。
extract
方法是数据映射器的一部分,而他的对应方是hydrate
。
ZF2有许多用于从数据库中保湿对象的类。您可以查看Zend\Stdlib\Hydrator
文件夹。
例如,您会找到适用于您的用例的Zend\Stdlib\Hydrator\ObjectProperty。