Php 域驱动设计,映射器/存储库值高于/低于

Php 域驱动设计,映射器/存储库值高于/低于,php,domain-driven-design,repository-pattern,Php,Domain Driven Design,Repository Pattern,在我从事的一个项目中,我们使用领域驱动设计。我们还使用映射器和存储库模式。其中映射器只是crud操作,存储库看起来像实体 看起来像是 class UserMapper { public function fetch($criteria) { // magic on the database } } class UserRepository { public function getByName($name) { $thi

在我从事的一个项目中,我们使用领域驱动设计。我们还使用映射器和存储库模式。其中映射器只是crud操作,存储库看起来像实体

看起来像是

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个函数。如何在repository/mapper模式中实现这一点。为了使事情更加复杂,我没有使用SQL数据库。但是MongoDB,现在这应该不是什么大问题了

--

使用eulerfx给出的答案,我得到了以下代码 使用应用\规范\抽象规范

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,所以我不能使用这些单词,或者将它们重命名为和OF

此外,规范模式还会查看抛出的数据集。这是为了满足我的需要,不是最好的方法,所以我使用了getQuery方法,而不是issatified方法

所有查询逻辑都可以在规范中找到。存储库使用规范comon函数构建,比如get by id

映射器只是数据集的简单crud处理程序(fetch、fetchAll、count、insert等)


最后,如果我想更改数据库语言(从mongo语法到sql),我只需要更改getQuery方法。希望它能对某些人有所帮助

看来您正在尝试解决复杂查询中的复杂性问题。为此,您可以使用。使用规范模式,您将拥有一个表示查询的对象。该对象将由关于当前实体的谓词组成,例如
WhereHeightIsLowerThan 3
。然后,存储库将基于此规范对象构建SQL查询或MongoDB查询。

您成功地解决了这个问题吗?你试过规范模式吗?我很好奇,因为我正在处理同一个问题。我使用了规范模式,但有一个小小的变化。规范模式。建议对数据进行迭代。因此,我用getQuery更改了ISsatified函数,它返回一个mongo查询以在数据库上使用。那么,规范对象的解释是否特定于您的存储库?与中一样,
DbuserRepository
可能会提供来自规范的查询,而作为
ArrayUserRepository
可能会处理完全不同的查询?或者我遗漏了什么?我在问题中举了一个例子,我要求给出我在使用eulerfx的anwser时所做的实现