Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中没有ORM映射的DDD值对象和实体_Php_Orm_Entity_Domain Driven Design_Value Objects - Fatal编程技术网

PHP中没有ORM映射的DDD值对象和实体

PHP中没有ORM映射的DDD值对象和实体,php,orm,entity,domain-driven-design,value-objects,Php,Orm,Entity,Domain Driven Design,Value Objects,首先,正如我所知,DDD中的实体和值对象几乎相同,只是实体具有标识。我读过的每一篇文章都说,实体id与任何ORM工具都有ORM映射。但我不想在实体中使用ORM映射。相反,我希望使用存储库接口执行数据库操作,而无需映射。而且,在这种情况下,我被困在我应该怎么做 我将用下面的例子在脑海中解释 假设我有一个TODO应用程序,TODO中有一些问题,每个问题中都有一些答案 我们有3个价值对象(或实体): 待办事项 待办事项 TodoQuestionValue 现在,我认为我有一个用于TODO的值对象(或实

首先,正如我所知,DDD中的实体和值对象几乎相同,只是实体具有标识。我读过的每一篇文章都说,实体id与任何ORM工具都有ORM映射。但我不想在实体中使用ORM映射。相反,我希望使用存储库接口执行数据库操作,而无需映射。而且,在这种情况下,我被困在我应该怎么做

我将用下面的例子在脑海中解释

假设我有一个TODO应用程序,TODO中有一些问题,每个问题中都有一些答案

我们有3个价值对象(或实体): 待办事项 待办事项 TodoQuestionValue

现在,我认为我有一个用于TODO的值对象(或实体)。此值对象有一个获取问题的方法,该方法获取TodoQuestion值对象的数组。在TodoQuestionValue对象内部,我们有一个方法来获取问题的值,这个方法获取TodoQuestionValue数组


假设我有一个TODO应用程序,TODO中有一些问题,每个问题中都有一些答案

你只需要把它翻译成代码。这里唯一的实体是Todo。将其设为聚合根并为其创建存储库

<?php

class Todo
{
    private int $id;
    /**
     * @param array<TodoQuestion> $questions
     */
    private array $questions;

    public function getQuestions()
    {
        return $this->questions;
    }
}

您不需要超过这两种方法。如果您想要一个Todo的问题列表,只需获取Todo聚合根,然后调用
->getQuestions()
。在存储库实现中,您可以决定使用orm,编写原始查询,序列化聚合,然后保存它。。。可能性是无穷的,请确保您的模型与这些基础设施问题保持解耦。

非常感谢您的努力和回答。为了澄清,我想问一些问题。我假设“无愚蠢问题”原则也适用于此:)我从何处将其称为ToDepository?通常我有“服务类”,存储库被注入其中。这些存储库返回的是基本值,而不是值对象。我是否仍应将todo存储库包装在其中?在这种情况下,初始化todoQuestion的最佳方法是什么?是否应该在聚合根目录中执行此操作?Vielen DankRepositories应仅返回聚合根或聚合根集合。您可以从域服务或应用程序服务调用存储库。要将问题添加到Todo中,首先从存储库中获取Todo对象,创建一个新的问题对象并将其添加到$Todo->addquestion($question)。然后可以使用存储库保存聚合
<?php

class TodoQuestion
{
    private string $question;
    private array $values;
    /**
     * @var TodoAnswer[]
     */
    private array $answers;

    public function getValues()
    {
        return $this->values;
    }

    public function getAnswers(): array
    {
        return $this->answers;
    }
}
interface TodoRepository {
    public function save(Todo $todo): void;

    public function todoOfId(TodoId $id): Todo;
}