【问题标题】:What does an entity's constructor look like for DDD in php?php中DDD的实体构造函数是什么样的?
【发布时间】:2015-04-28 22:55:35
【问题描述】:

我对使用 DDD 方法的 PHP 中的构造函数是什么样子感到困惑。这是我目前所拥有的:

实体

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 中的外观(我很难找到好的示例)。

【问题讨论】:

    标签: php constructor entity domain-driven-design ddd-repositories


    【解决方案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) { }
    

    如果你真的有庞大的构造函数,你可以考虑构建器模式。

    How many constructor arguments is too many?

    【讨论】:

    • 是的!我得出的正是这一点。我本来打算最终回答我自己的问题,但你打败了我。实际上,我现在经常使用值对象,而且效果很好。谢谢!接受这个...
    • 很高兴为您提供帮助 :) 继续努力!
    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2018-01-29
    • 2015-05-17
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多