2013-03-18 19 views
5

我一直在研究和閱讀很多關於使用PHP中的單獨圖層來創建可維護和可讀的代碼。 但是,我看到很多代碼將實體和數據庫訪問放在一個類中。 例如:php DAL - 獨立的實體和數據庫?

class User{ 
    public $id; 
    public $username; 
    public $database; 

    function add(){ 
      $database->query .... 
    } 
} 

我覺得這很奇怪,因爲在這裏你是混合數據庫元素的用戶類,這使得它更難以維持。

我喜歡的工作是這樣的:

  • 一個單獨的數據庫類
  • 用戶類
  • 一個用戶數據類

這是這樣的:

$database = new Database(); 
$database->openConnection(); 
$dataUser = new DataUser($db); 
$user = new User(1,"myname"); 
$dataUser->saveUser($user); 

所以我想知道,我在工作嗎?正確的方式還是第一種更好的創建代碼的方式? 我覺得可能很容易維護,因爲你有一個單獨的實體和一個單獨的數據庫類來處理數據庫操作。

+0

+1不錯的問題:) – 2013-03-18 09:02:53

+1

+1太好了...... – 2013-03-18 09:27:19

回答

1

易於維護,因爲你有一個獨立的實體和獨立 數據庫類

看樣子你是說,你想從Active Record做法,轉而移到Data Mapper/Entity/Repository方法。這是一個很好的方向,因爲它採用了更好的問題分離。你可以建立這個自己,但你可能想看看像Doctrine解決方案,它可以讓你做的線沿線的東西:

$product = new Product(); 
$product->setName($newProductName); 
$entityManager->persist($product); 

$product實體只是一個POPO(普通老式PHP對象)包含記錄數據,並且不知道它是如何保持的,並且當需要持久化時,它被傳遞到實體管理器以處理存儲。

+0

謝謝,我只是想分開實體,以便我可以檢索它們作爲對象,而不是與數據的數組例如。 我會研究教義。 – randomizer 2013-03-20 09:10:49

1

就個人而言,我認爲從User摘錄UserData很可能是矯枉過正。因爲在這種情況下,UserData很可能是非常相似ProductData例如 - 他們仍然會包含一個add($data)find($id)

在你的情況,User是在MVC方法的典範,並且是完全可以接受數據庫存儲/檢索邏輯。然而,您可能會發現,您在User類中重新創建了與其他模型中相同的DB方法。這是您可以開始查看ORM實施的位置。因此,通用數據庫訪問方法在抽象類中定義,所有模型隨後都會根據需要進行擴展和重寫。

+0

我正在閱讀這個話題,我不太瞭解你的最後一行。 我的Userdata,ProductData等都包含了我們說的「保存」,「查找」和「刪除」功能,這是不正常的,因爲他們必須對不同的表執行查詢。 我沒有在這裏得到抽象類的好處,我將使用抽象類來讓我們說實例化我的數據庫適配器,以便它可以在我所有的xData類中使用。 – randomizer 2013-04-12 07:01:15

1

我該怎麼辦:

我的模型並不實​​體連接到數據庫(如果我不使用原則),所以沒有「活動記錄」的方法。一個對象不知道如何獲取其依賴關係(例如,用戶可能有n條評論,我的模型不知道如何獲得評論)。

class User{ 
private $name; 
private $password; 
// getter and setters 
} 

我有一些業務邏輯可以從提供者獲取模型,一個服務可以有很多提供者。

class UserService{ 
    function __construct(IUserProvider $userProvider){ 
     $this->userProvider = $userProvider 
    } 
    function getUsers(){ 
     // return an array of user objects 
     return $this->userProvider->getUsers(); 

    } 
} 

最後我有一個知道如何從數據庫中請求DATAS,一個文本文件,一個JSON文件,web服務數據提供:

class UserProvider implements IUserProvider{ 
     function __construct(Connection $connection){ 
     $this->connection = $connection; 
     } 
     function getUsers(){ 
     return $this->toUsers($this->connection->fetchAssoc("Select * from users")); 
     } 
     function toUsers(array $datas){ 
      // convert user records to an array of User 
      (...) 
      return $users; 
     } 
} 

則接口

interface IUserProvider{ 
    /**@return array an array of User */ 
    function getUsers(); 
} 

如果我需要獲得用戶評論,那麼我的評論服務知道如何從用戶ID獲取評論。所以要得到一個用戶及其評論,我需要2個對數據庫的請求。一個來自UserProvider,另一個來自CommentProvider。

,所以我有3層:

  • 我的應用層(顯示用戶,響應請求無論...)
  • 我的服務層(其具有與一個命令行接口的工作,而不是知道我的web應用程序,除了密碼編碼,這通常被綁定到框架我用的,ACL充塞也許...)
  • 其中一無所知其他層我的數據訪問層的

我的圖層溝通的唯一方式是通過模型從層到層傳遞。

而我所有的類都是用依賴注入容器構建的,所以接線不成問題。

下面是一個應用程序,我做的爲例,它是開源:https://github.com/Mparaiso/silex-bookmarkly

任何想法歡迎。