簡體   English   中英

Zend框架 - 我為什么要使用數據映射器/ Db_Table_Row?

[英]Zend framework - Why should I use data mapper / Db_Table_Row?

擴展問題:為什么我應該使用數據映射器/ Db_Table_Row,因為DbTable能夠處理大多數數據操作的基本任務。

我目前正在學習ZF v1.11

對於數據庫操作,我為每個表創建了DbTable。 例如,“users”表由Application_Model_DbTable_Users表示,其中沒有附加代碼。

在操作數據時,我可以使用:

<?php
$uTable = new Application_Model_DbTable_Users();
$newUid = $uTable->insert(array('name'=>'Old Name', 'email'=>''));
$user = $uTable->find($newUid)->current();

// Then I can use $user which is instance of Table_Row
$user->name = "New Name";
$user->email = "email@addr.com";
$user->save();

我的問題是,何時需要定義一個行類(假設在ZF-Tutorials中將Table_Row稱為DataMapper)

// By, adding this to the DbTable class
protected $_rowClass = 'Application_Model_User';

為每個實體設置Row類有什么好處? 任何人都可以指出我的最佳做法。

您不需要定義自己的Table_Row。 但是,它在許多情況下可能很有用,特別是如果要為給定用戶行定義某些特定方法或屬性。 它們還可以提高代碼的可讀性。

例如 ,在Users表的情況下,您可以在自定義用戶行中定義一個名為getFullName()的方法,如下所示:

public function getFullName() {
    return $this->firstName . ' ' . $this->lastName;
}

然后,當您獲取用戶行對象時,要獲取用戶的全名,您只需執行以下操作:

$user = $uTable->find($newUid)->current();
$fullName = $user->getFullName();

第二個示例是當您有一些父表到Users表時,例如Addresses。 在這種情況下,您可以在用戶行中定義一個名為getAddress的方法:

public function getAddress() {
    return $this->findParentRow('Application_Model_DbTable_Addresses');
}

在這種情況下,您將獲得當前用戶的Address行對象,如下所示:

$user = $uTable->find($newUid)->current();
$addressRow = $user->getAddress();

另一個例子是,當你想要創建自定義刪除或instert方法時。 讓我們假設您要確保不想使用delete()方法刪除管理員用戶。 然后你可以從Zend_Db_Table_Row重載delete方法,如下所示:

public function delete() {
        if ('admin' === $this->userRole) {
              return 0;
        }
        return parent::delete();
} 

這樣,您就無法通過在用戶行對象上調用delete()來刪除管理員用戶:

 $user = $uTable->find($newUid)->current();
 $rowsDeleted = $user->delete(); // would be 0 if $user is admin

這些只是三個基本示例,顯示了定義自己的行類的有用性。 但當然他們沒有必要。 但是,根據我自己的經驗,它們非常方便。

簡而言之:它是關於隔離的。

Zend_Db_Table是表數據網關的實現。 它通過一個類將CRUD訪問引導到特定的表視圖。 它通常與表模塊一起使用 ,例如,包含網關處理的記錄的業務邏輯的類。

Zend_Db_Table_Row行數據網關模式的實現 這里,返回的對象看起來與數據庫記錄完全相同,它們包含用於處理該數據的業務邏輯,但它們不包含CRUD的邏輯以及它們來自的表(即ActiveRecord),而是聚合它們。

只要沒有太多的對象關系阻抗不匹配,行數據網關就可以了。 一個對象如何在一個關系數據庫中持久化以及它在對象世界中的外觀通常是完全不同的東西。 使用域模型時 ,業務對象的結構通常與存儲在數據庫中的方式不同。 因此,您無法輕松地從數據庫中對它們進行CRUD。 這就是DataMapper發揮作用的地方。

DataMapper負責將Domain對象映射到Recordsets,反之亦然。 這使您的應用程序更易於維護,因為它將您的Domain對象與Database結構分離。 它使它們保持分離,並為您提供更多靈活性,以便對兩個層(持久性和域)進行建模。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM