在我正在进行的一个项目中,我们使用领域驱动设计。有了这个,我们还使用了映射器和存储库模式。映射器只是粗略的操作,而存储库看起来像实体。
所以它看起来像
class UserMapper
{
public function fetch($criteria)
{
// magic on the database
}
}
class UserRepository
{
public function getByName($name)
{
$this->mapper->fetch(array('name' => $name));
}
}
代码不起作用,但它给出了一个大致的想法
现在我遇到了以下问题
假设我想要名称为“john”且性别为“male”的用户。存储库现在是否应该有一个函数 getByNameAndGender($name, $gender)。但是你很快就会得到很多功能,因为你需要性别、年龄和姓名等。
接下来是我发现的所有示例仅实现以下“值 == 值”。但是没有一个例子是像“value < value”或其他东西。所以我的问题是你如何实现这一点。因为我再次看到你可以制作像
getWhereHeightIsLowerThan($height)
getWhereHeightIsLowerThanOrEquals($height)
getWhereHeightIs($height)
getWhereHeightIsGreaterThan($height)
getWhereHeightIsGreaterThanOrEquals($height)
同样是 5 个函数,应该类似于 1 个函数。您如何在存储库/映射器模式中实现这一点。为了使事情更加复杂,我没有使用 SQL 数据库。但是 MongoDB,现在这应该不是一个大问题。
--
使用 eulerfx 给出的答案,我附带了以下代码
使用 Application\Specification\AbstractSpecification;
class IdIsSpecification extends AbstractSpecification
{
/** @var string */
protected $id;
/**
* @param $id
* @throws \InvalidArgumentException
*/
function __construct($id)
{
if(!is_string($id))
{
throw new \InvalidArgumentException('Expects string, given ' . gettype($id));
}
$this->id = $id;
}
/**
* @return mixed
*/
public function getQuery()
{
return [
'_id' => new \MongoId($this->id),
];
}
}
我使用 php,所以我不能使用 AND 和 OR 这两个词,所以将它们重命名为 ALSO 和 OF。
此外,规范模式会查看扔给它的数据集。这对于我的需要不是最好的方法,所以我有方法 getQuery 而不是 isSatisfied。
所有查询逻辑都在规范中找到。存储库使用规范的通用函数构建,例如通过 id 获取。
映射器只是数据集的简单粗加工处理程序(fetch、fetchAll、count、insert 等)。
最后,如果我想更改数据库语言(从 mongo 语法到 sql),我只需要更改 getQuery 方法。希望它可以帮助某人