1

它將是一個完全理論化的線程。使用特殊的「提議」對象而不是數組

讓我們來談談將數組更改爲特定對象的方法,以便對其進行比較和處理。

例如,我們有一個EntityClassEntityInterfaceSomeRepositorySomeManagerSomeCommand

實體是一個明顯的對象,例如:

class EntityClass implements EntityInterface { 
    public $name; 

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

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

庫OFC。有方法來保存源代碼中的對象並從源代碼中獲取它。

管理器具有所有'業務邏輯',它可以使用命令模式修改實體,爲一個屬性修改一個命令,因此所有屬性的業務邏輯將其存儲在單獨的命令中,並由管理器將其激活。

現在,在經理啓動所有的邏輯和樂趣。 小小的速記:

  1. 存儲庫通過getOne()創建新的實體。
  2. 我們創建了一個新的管理器實例,並通過構造函數傳遞了一些依賴項,如控制器和實體中的數據數組。
  3. 數據數組包含有關更改的信息,例如:['name' => 'New name']; mapper解決管理器針對給定數組應該執行的命令。
  4. 管理器對此請求執行所有命令並將原始數組傳遞給每個命令。

現在,我們爲什麼要傳遞數組?當我們在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數組,以及我們的代碼工作中的所有命令和其他方法,而不是數組。

但是,我們的存儲庫不能保存對象的instance of EntityProphoseInterface

這就是全部... 是否有一些設計模式名稱?或類似的東西?

或者這個想法很糟糕?

我希望所有人都清楚,如果不是的話,請問。 任何想法?建議?

回答

0

是什麼讓我發瘋就是爲什麼你會從一個數組落實分配值的功能,整個類,而不是僅僅使用常規的任務:

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

也許你想簡化此代碼。 ..但是使用數組有什麼意義?

您的經理類(實際上,服務)應該提供具有與您想要修改或操作的任何實體相對應的參數的函數,或者僅接收DTO或實體本身。

在另一方面,如果你想如何集中DTO的或實體映射另一個人,也許你需要實現對象映射器:

class EntityMapper { 
    public function mapCustomerToCustomer($customerA, $customerB) { 
     if($customerA->name != null) { 
       $customerB->name = $customerA->name; 
     } 
     // and so on... 
    } 
} 

...你可以注入它,無論你想來映射實體。例如,CustomerService可能如下所示:

class CustomerService { 
    function __construct($entityMapper) { 
     $this->entityMapper = $entityMapper; 
    } 

    public function update($customer) { 
     $customerToUpdate = $this->repository.getById($customer->id); 
     $this->entityMapper->mapCustomerToCustomer($customer, $customerToUpdate); 

     $this->repository.addOrUpdate($customerToUpdate); 
    } 
} 
相關問題