使用特殊'建议'对象而不是数组

时间:2016-11-24 20:54:20

标签: php oop design-patterns domain-driven-design design-principles

它将成为一个完全理论化的主题。

让我们谈谈将数组更改为特定对象,以便对其进行比较和处理。

例如,我们有EntityClassEntityInterfaceSomeRepositorySomeManagerSomeCommand

实体是一个明确的对象,例如:

class EntityClass implements EntityInterface {
    public $name;

    public funtion getName() {
        return $this->name;
    }

    public function assign($data) {
        $this->name = $data['name'];
    }
...
}

知识库。有方法在源中保存对象并从源头获取它。

管理器具有所有'业务逻辑',它可以使用命令模式修改实体,一个命令用于一个属性,因此所有属性的业务逻辑都存储在单独的命令中#39 ; s,经理解雇它。

现在,在经理开始所有的逻辑和乐趣。 简写:

  1. 存储库通过getOne()创建新实体。
  2. 我们创建一个新的manager实例,并通过构造函数传递一些依赖项,例如来自controller和Entity的数据数组。
  3. 数据数组包含有关更改的信息,例如:['name' => 'New name']; mapper解析管理器应该为给定数组触发的命令。
  4. Manager执行此请求的所有命令,并将原始数组传递给每个命令。
  5. 现在,为什么我们传递数组?当我们在OOP时,为什么不使用EntityClass ??

    的特殊变体

    现在让我们添加一个新接口EntityProposeInterface,并将原始数组更改为类实现此接口,然后传递它们。

    例如我们可以添加SomeManager speciall方法来变形这样的实体(PHP7 +):

    class SomeManager {
       public function morph($entity) {
           $buff = new class extends EntityClass implements EntityProphoseInterface{};
           $buff->assign($entity->toArray());
           return $buff; 
      }
    

    现在我们有一个EntityProphose让我们对它进行一些更改,现在经理从原始数据数组中更改EntityProphose,并且我们的代码中的所有命令和其他方法都可以正常工作&#39 ; s对象kinde EntityProphose而不是数组。

    但是。我们的存储库无法保存对象instance of EntityProphoseInterface

    这就是...... 有一些设计模式名称?或类似的东西?

    或者这个想法非常糟糕?

    我希望你们所有人都清楚,如果不是,请问。 有任何想法吗 ?建议?

1 个答案:

答案 0 :(得分:0)

让我发疯的原因是你为什么要实现一个函数来将数组中的值分配给整个类而不只是使用常规赋值:

<div class="form-group">
  <label class="control-label col-md-3" for="Employer_EmployerTitle">Employer</label>
  <div class="col-md-6">
    <div class="input-group">
      <input name="Employer.EmployerTitle" class="form-control text-box single-line valid" id="Employer_EmployerTitle" aria-invalid="false" style="text-transform: uppercase;" type="text" value="StackOverflow inc.">
      <div class="input-group-btn">
        <button class="btn btn-success" id="btnModalSearch" onclick="EmployerSearchModalShow()" type="button">Search</button>
        <button class="btn btn-default">
          <span title="" class="glyphicon glyphicon-info-sign" id="toolTipSpanEmployerSearch" data-original-title="Search Employers from local database." data-toggle="tooltip" data-placement="right"></span>
        </button>
      </div>

    </div>
  </div>
  <div class="col-md-3">
    <span class="field-validation-valid text-danger" data-valmsg-replace="true" data-valmsg-for="Employer.EmployerTitle"></span>
  </div>
</div>

也许你想简化这段代码......但是使用数组有什么意义呢?

您的经理类(实际上,服务)应该为函数提供与您要修改或操作的任何实体相对应的参数,或者仅接收DTO或实体本身。

另一方面,如果你想集中DTO或实体如何相互映射,也许你需要实现对象映射器:

$entity->name = name;
$entity->age = age;

...您可以将它注入任何想要映射实体的地方。例如,class EntityMapper { public function mapCustomerToCustomer($customerA, $customerB) { if($customerA->name != null) { $customerB->name = $customerA->name; } // and so on... } } 可能如下所示:

CustomerService