我一直在做大量的研究,但无法找到这个看似流行的问题的答案。
我有一个包含一些属性的域模型 - 比如说firstName
和lastName
- 但在我的数据库中我将它们存储为fname
and lname
。
根据良好PoEAA的规则,模型应该不知道它是如何存储的,如果有的话。所以我的问题是,这些字段的映射到哪里去了?
查看实现接口的现有类的源代码,Zend\Stdlib\Hydrator\AbstractHyrdrator
我看不到它们中的任何一个提供映射功能。
有没有人看到一个不污染模型的干净解决方案?
更新:更好更简单的解决方案
自从我问这个问题以来已经有一段时间了,但是这里将是一个非常简单的解决方案,可以将列映射到对象而无需太多开销。使用 ZF2 的内置命名策略功能可以实现所需的效果。
<?php
use Zend\Stdlib\Hydrator\NamingStrategy\UnderscoreNamingStrategy;
use Zend\Stdlib\Hydrator\ObjectProperty;
class Person {
public $fname;
public $lastName;
}
class MyNamingStrategy extends UnderscoreNamingStrategy {
protected $map = [
'fname' => 'first_name'
];
public function hydrate($name) {
$map = array_flip($this->map);
if(isset($map[$name])) {
return $map[$name];
}
return lcfirst(parent::hydrate($name));
}
public function extract($name) {
$map = $this->map;
if(isset($map[$name])) {
return $map[$name];
}
return parent::extract($name);
}
}
$p = new Person();
$h = new ObjectProperty();
$h->setNamingStrategy(new MyNamingStrategy());
$h->hydrate([
'first_name' => 'john',
'last_name' => 'Doe'
],$p);
var_dump($p);
var_dump($h->extract($p));
输出:
object(Person)[4]
public 'fname' => string 'john' (length=4)
public 'lastName' => string 'Doe' (length=3)
array (size=2)
'first_name' => string 'john' (length=4)
'last_name' => string 'Doe' (length=3)