php 中 DDD 的实体构造函数是什么样的?
What does an entity's constructor look like for DDD in 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 中的外观(我很难找到好的例子)。
在构造函数上传递值数组不是一个好主意。如果数组中不存在所需的数据。您的域实体将处于无效状态。
只需将必填字段单独放在构造函数中,这样就更具可读性并且必填字段是明确的。如果您忘记提供所需的数据,您将遇到大多数好的 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) { }
如果你真的有庞大的构造函数,你可以考虑构建器模式。
How many constructor arguments is too many?
我对 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) { }
如果你真的有庞大的构造函数,你可以考虑构建器模式。
How many constructor arguments is too many?