【问题标题】:PHP MVC model naming convention, singular/plural?PHP MVC 模型命名约定,单数/复数?
【发布时间】:2014-05-07 04:37:18
【问题描述】:

我想知道创建/命名模型的首选方法是什么?

我的应用程序有一个“用户”模型,其中包含用于创建、获取、更新(等)用户记录的所有相关业务逻辑。

在我的一些控制器中,我可能想要获取多个“用户”记录的列表。

在这种情况下,我应该创建一个名为 Users 的全新模型吗?

在我看来,有几个选择:

  1. 我可以向控制器授予数据库访问权限,并且控制器可以查询所有相关用户,然后在我循环访问它们时创建一个用户模型对象。 (坏)

  2. 我可以有两个单独的模型,“用户”和“用户”。用户对象将处理创建、获取、更新单个记录,而用户对象实际上只对列出所有用户记录有用。

我不喜欢这样的想法:

$user = new User();
$user->fetchAll();

纯粹出于语义原因。在我看来,一个用户对象应该只与一个用户记录相关。

也许我想错了,我的“用户”模型与数据库中的“用户”表相关,从一开始就应该真正命名为“用户”。

你如何处理这个问题?

【问题讨论】:

  • 模型是单数。因为每个应用程序只有一个。它是一层。对于“模型”,您可能意味着domain objects 和域对象的集合。 This post 可能有用。

标签: php naming-conventions inflection


【解决方案1】:

嗯,我想尽量保持一致.. 对我来说,我将使用 User 模型与表 User 进行交互,所以我并不真正关心我将与多少条记录进行交互..

检查这个问题:going to build a php MVC, what naming conventions do i need to be aware of?

【讨论】:

    【解决方案2】:

    您不希望使用单独的模型来表示单数或复数版本。只是其中之一。您可以拥有用户实例的集合,但这是一个集合(数组),而不是“用户”类。

    实际上,您可以在语义上随意调用模型,但单数似乎是公认的规范。

    基本上,您应该考虑的方式是用户模型代表单个“用户”,因此您的用户服务/存储库的 findAll 方法应该返回单个用户实体/模型的集合/数组。

    【讨论】:

      【解决方案3】:

      我认为你的想法是正确的。为了保持单一职责,您的User() 类不应参与表的获取和更新。它应该只代表一个用户,它的功能应该与之直接相关。如果您开始将 User() 函数和表的函数混合在一起,那么您就破坏了单一职责。出于这个原因,我采用第二种方法,这就是它在我使用过的框架中的工作方式

      在 Zend Framework 中,扩展 Zend_Db_Table 的类处理表操作,并返回扩展 Zend_Db_Table_Row 的类。在 Zend Framework 中,Zend_Db_Table_Row 有一个savedelete 方法,它们回调表来进行实际的保存和删除。我认为这与唱责任保持一致,因为您认为该责任直接与该行有关,而不仅仅是与该行分离的模型。不过,你有两个类。一个表类和一个行类

      在 Doctrine 中(我是新手,所以我不熟悉高级用法),每个模型都代表表中的一行,即使定义行中的列也是如此。这些行由 Doctrine Repository 获取、更新和创建。如果您只需要为您的表创建一个存储库,那么您可以这样做,但它是与 User() 不同的一个类

      总而言之,为了符合单一职责,我会让UsersTable()::fetchAll() 返回User[]。就个人而言,我希望 User 能够调用 UsersTable 来更新或删除该行,但这只是个人喜好。

      【讨论】:

      • 对不起,我以为我是这么说的。 Users() 或 UsersTable() 扩展 Zend_Db_Table,而 fetchAll() 或 fetchRow() 返回一个扩展 Zend_Db_Table_Row 的 User() 的 Rowset。有什么问题吗?如果有,请告诉我
      【解决方案4】:

      在过去的几天里,我一直在为同一件事撞墙。

      我更愿意自己保留一个班级,但我想这是 OOP 可能会受到轻微限制的地方。

      我会说,如果你只想要一个类,那么我会选择 Plural,因为用户返回多个用户没有语义意义,

      我知道这已经得到了回答,但我会贡献我的 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多