[英]Naming convention: singular vs plural for classes describing entities in PHP
[英]PHP MVC model naming convention, singular/plural?
我想知道創建/命名模型的首選方法是什么?
我的應用程序有一個“用戶”模型,其中包含用於創建、獲取、更新(等)用戶記錄的所有相關業務邏輯。
在我的一些控制器中,我可能想要獲取多個“用戶”記錄的列表。
在這種情況下,我應該創建一個名為 Users 的全新模型嗎?
在我看來,有幾個選擇:
我可以授予對控制器的數據庫訪問權限,並且控制器可以查詢所有相關用戶,然后在我循環訪問它們時創建一個用戶模型對象。 (壞的)
我可以有兩個單獨的模型,“用戶”和“用戶”。 用戶對象將處理創建、獲取、更新單個記錄,而用戶對象實際上只對列出所有用戶記錄有用。
我不喜歡做這樣的事情的想法:
$user = new User();
$user->fetchAll();
純粹出於語義原因。 在我看來,一個用戶對象應該只與一個用戶記錄相關。
也許我想錯了,我的“用戶”模型,它與數據庫中的“用戶”表相關,從一開始就應該真正命名為“用戶”。
你如何處理這個問題?
嗯,我想盡量保持一致.. 對我來說,我將使用 User 模型與表 User 進行交互,所以我並不關心我將與多少條記錄進行交互..
檢查這個問題: 要構建一個 php MVC,我需要注意哪些命名約定?
我認為你有正確的想法。 為了保持單一職責,您的User()
類不應參與表的獲取和更新。 它應該只代表一個用戶,它的功能應該與之直接相關。 如果你開始將你的User()
函數和表的函數混合在一起,你就破壞了單一職責。 出於這個原因,我采用第二種方法,這就是它在我使用過的框架中的工作方式
在 Zend Framework 中,擴展Zend_Db_Table
的類處理表操作,並返回擴展Zend_Db_Table_Row
的類。 在 Zend Framework 中, Zend_Db_Table_Row
有一個save
和delete
方法,它回調表來進行實際的保存和刪除。 我認為這與唱責任保持一致,因為您認為該責任直接與該行有關,而不僅僅是與該行分離的模型。 不過,你有兩個班級。 一個表類和一個行類
在 Doctrine 中(我是新手,所以我不熟悉高級用法),每個模型都代表表中的一行,即使定義行中的列也是如此。 這些行由 Doctrine Repository 獲取、更新和創建。 如果您只需要表的存儲庫,那么您可以這樣做,但它是與User()
不同的類
總而言之,為了符合單一職責,我會讓UsersTable()::fetchAll()
返回User[]
。 就個人而言,我希望User
能夠調用UsersTable
來更新或刪除該行,但這只是個人喜好。
您不需要單獨的模型來表示單數或復數版本。 只是其中之一。 您可以擁有用戶實例的集合,但這是一個集合(數組),而不是“用戶”類。
實際上,您可以在語義上隨意調用您的模型,但單數似乎是公認的規范。
基本上,您應該考慮的方式是用戶模型代表單個“用戶”,因此您的用戶服務/存儲庫的 findAll 方法應該返回單個用戶實體/模型的集合/數組。
在過去的幾天里,我一直在為同樣的事情撞牆。
我寧願自己保留一個班級,但我想這是 OOP 可能會受到輕微限制的地方。
我會說如果你只想要一個類,那么我會選擇復數,因為用戶返回多個用戶沒有語義意義,
我知道這已經得到回答,但我會貢獻我的 2 美分:
class UserModel
{
/**
* @var $user
*/
public $user;
function __construct()
{
}
public function get_all()
{
//Get all products
}
public function get($where)
{
//Get user instance here either by:
$this->user = $result; //Result from SQL Row
//or:
return new User($result);
}
}
class User
{
public $firstname;
public $lastname;
public $somevar;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.