Я запутался в том, как выглядит конструктор в 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 (мне трудно найти хорошие примеры).
Передача массива значений в конструктор не очень хорошая идея. Если необходимые данные отсутствуют в массиве. Ваш домен будет в недопустимом состоянии.
Просто поместите обязательные поля индивидуально в конструктор, чтобы он был более читабельным, а обязательные поля явными. Если вы забыли предоставить необходимые данные, у вас будет ошибка, которая поддерживается большинством хороших 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) { }
Если у вас действительно есть огромный конструктор, вы можете рассмотреть шаблон конструктора.
Других решений пока нет …