Как выглядит конструктор сущности для DDD в php?

Я запутался в том, как выглядит конструктор в PHP, используя подход DDD. Это то, что я до сих пор:

сущность

class People {

    // Fields
    private $id;
    private $first_name;      // required
    private $middle_name;
    private $last_name;       // required 
    private $phone;           // required (or mobile_phone required)
    private $mobile_phone;
    private $email;           // required
    private $alt_email;
    private $something_else;  // required

    public function __construct($fields){

        // Set some properties
        $this->setFromArray($fields); 

        // Don't instantiate a new entity object in an invalid state
        // (ie. determines if required fields are given)
        if(!$this->isValid()){  
            throw new Exception("Can't create person");
        }
    }

    // some getters and setters...

    // some other domain methods so entity is not anemic
    ...

вместилище

class PeopleRepository {   // <-- Should probably be an interface

    public function get($id){
       ...
    }

    public function save(People $people){
        // Will INSERT or UPDATE based on if an ID is set in $people
    }

Простой пример

// a very very simple example
$peopleRepo = new PeopleRepository();
$people = new People($_POST);
$peopleRepo->save($people);

Я не хочу использовать ORM. Является ли способ, которым я делаю это выше, правильный подход для конструктора сущностей в DDD? Пожалуйста, объясните и приведите пример того, как PHP-конструкторы выглядят в DDD (мне трудно найти хорошие примеры).

1 ответ

Решение

Передача массива значений в конструктор не очень хорошая идея. Если необходимые данные отсутствуют в массиве. Ваш домен будет в недопустимом состоянии.

Просто поместите обязательные поля индивидуально в конструктор, чтобы он был более читабельным, а обязательные поля явными. Если вы забыли предоставить необходимые данные, у вас будет ошибка, которая поддерживается большинством хороших IDE.

__construct($firstName, $lastName, $phone, $email) { }

Вы можете также рассмотреть возможность использования ValueObject для группировки связанных данных, чтобы сузить ваш конструктор. Для получения дополнительной информации о ValueObjects перейдите по этой ссылке.

http://richardmiller.co.uk/2014/11/06/value-objects/

В вашем случае с именем. инкапсулируйте их внутри ValueObject FullName

final class FullName 
{
    private $firstName;
    private $middleName;
    private $lastName;

    public function __construct($firstName, $lastName, $middleName = null)
    {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->middleName = $middleName;
    }

    // getters method ONLY
    // you need to instantiate new FullName if you want to change the fields
}

тогда вы можете передать его конструктору People

__construct(FullName $fullName, $phone, $email) { }

Если у вас действительно есть огромный конструктор, вы можете рассмотреть шаблон конструктора.

Сколько аргументов конструктора слишком много?

Другие вопросы по тегам