1

在我的應用程序中,我有用戶,組織和員工。有每個這些域對象和數據庫映射器。這應該是控制器還是域的責任?

當用戶最初設置一個組織時,我想爲該用戶/組織組合自動創建一個員工記錄。 (記錄的類型將是所有者)。基本上這涉及到兩個數據庫插入:一個用於組織,另一個用於員工。

我可以看到兩種方式去了解這一點:

  1. 控制器可以創建新的組織對象,並使用一個映射,orgMapper::insert($newOrg),堅持它。完成後,可以創建新的Employee對象,並再次使用映射器employeeMapper::insert($newOwner)進行持久化。
  2. 控制器可以創建新的組織對象,並且該對象完成工作的其餘部分。它會調用orgMapper::insert($this),並且返回的鍵將創建並保留新的Employee對象。

第二種方法似乎有許多好處:業務邏輯(即每個新組織的員工/所有者記錄)嵌入在模型中,而控制器更加瘦小。我猶豫的唯一原因是這意味着我的域名變得依賴於我的映射器。

我會使用域中的工廠來獲取映射器,所以所有的耦合將歸結爲一個點。這是否使依賴關係可以接受?或者我有更深的設計問題?

我已經讀了一點關於服務層。也許這是我應該看的地方?

我使用PHP和Zend框架

您的想法是非常感謝。我的貓和我已經用盡了我們自己的想法...

+1

我會更多地關注某種類型的服務層,他的唯一工作是管理數據庫參照完整性,並將這項工作從個人數據映射器中提取出來。至少,儘管實現此目的所需的代碼很短,但它應該爲您提供可重用的編碼規則,以管理在同一數據集上工作的其他項目。恕我直言。希望我有道理。但是,根據你使用的數據庫軟件的不同,可能會錯過db級別的功能。你使用的是哪個數據庫? –

+0

@ bob-the-destroyer,我正在使用mySql –

+0

這些表的引擎是什麼? Myisam或innodb? –

回答

2

由於我不是ZF用戶(並且一直避免它),也許我的解決方案不適用。

數據映射器不應該只與數據庫中的單個表一起工作。相反,當您存儲新的Organization條目(並且我猜Organization實例包含Employee對象的集合)時,映射器還應創建Employees的所有條目以及OrganizationEmpoyees表中的隨附數據。

簡而言之:既不是,存儲是mapper的責任。

如果我誤解了DB結構,以及它如何與「(..)員工記錄該用戶/組織組合」和的Employee域對象從Organization完全獨立的,那麼第一你解決方案是可以接受的


至於在領域對象和映射器的頂部添加服務,這將是一個不錯的主意。因爲您已經在控制器中泄漏了域邏輯。看起來像是一件壞事。

0

我可以告訴你我在這種情況下做了什麼。任何時候,我需要獲取一堆數據並從中構建多個對象,然後將整個混亂轉儲到另一個模型(可能是服務層,我不知道),然後將對象從控制器中分離出來。我只是使用控制器來抓取數據並將它發送到其他地方(視圖或模型)。

例如,我想從我的音樂收藏中保存一些數據,數據當前處於csv文件中。我的控制器解析csv文件並將每行數據放入一個數組中,我將其轉發給一個類方法,該方法將數據分類爲對象並將其保存到數據庫中。 (PLZ注意:此方法是初步的,需要一些調整和調整)

//FROM class Application_Model_Tag 
public function saveTags() { 
     //TODO implement instantiation of Domain Models instead of passing arrays to mappers 
     $trackMapper = new Music_Model_Mapper_Track(); 
     $artistMapper = new Music_Model_Mapper_Artist(); 
     $albumMapper = new Music_Model_Mapper_Album(); 

     if (isset($this->_hash)) { 
      //see if track already exists by comparing hashs 
      $trackRow = $trackMapper->fetchByColumn('hash', $this->getHash()); 
      //if track does not exist 
      if (is_null($trackRow)) { 
       //save the artist 
       $artistData = array(
        'name' => $this->getArtist() 
       ); 
       //see it the artist exists by name 
       $artistRow = $artistMapper->fetchByColumn('name', $this->getArtist()); 
       //does artist exist? 
       if (is_null($artistRow)) { 
        $artistRow = $artistMapper->save($artistData); 
       } 

       //Save the Album Data 
       //does the album exist? 
       $albumRow = $albumMapper->fetchByColumn('name', $this->getAlbum()); 
       //if yes 
       if (is_null($albumRow)) { 
        $albumData = array(
         'name'  => $this->getAlbum(), 
         'artist_id' => $artistRow->id, 
         'art'  => $this->getAlbum() . '.jpg', 
         'year'  => $this->getYear() 
        ); 
        //get album row 
        $albumRow = $albumMapper->save($albumData); 
       } 
       //Save track data 
       $trackData = array(
        'title'  => $this->getTitle(), 
        'filename' => $this->getFilename(), 
        'path'  => $this->getPath(), 
        'format' => $this->getFormat(), 
        'genre'  => $this->getGenre(), 
        'artist_id' => $artistRow->id, 
        'album_id' => $albumRow->id, 
        'track'  => $this->getTrack(), 
        'play_time' => $this->getPlay_time(), 
        'hash'  => $this->getHash() 
       ); 
       //save track data 
       $trackMapper->save($trackData); 
      } 
     } else { 
      return; 
     } 
    } 

我希望這會有所幫助,並請原諒的例子的生硬。

相關問題