【问题标题】:Best Practice for fields in the model模型中字段的最佳实践
【发布时间】:2013-01-24 21:42:30
【问题描述】:

我想知道是否有最佳实践来设置模型将检索的字段。在这两种不同的方法之间(伪代码):

  1. 在控制器中定义值并将它们发送到模型。

    Controller::get()
    {
        $fields = ['id_user', 'name', 'etc'];
        Model::get_by_email($email, $fields);
    }
    
    Model::get_by_email($email, array $fields)
    {
        return fetch('SELECT $fields FROM user');
    }
    
  2. 模型方法定义了要检索的字段。

    Controller::get()
    {
        Model::get_by_email($email);
    }
    
    Model::get_by_email($email)
    {
        $fields = [self::ID_USER, self::NAME, self::ETC);
        return fetch('SELECT $fields FROM user');
    }
    

每种方法都有不同的优点和缺点。你怎么看?

【问题讨论】:

标签: model-view-controller model controller field


【解决方案1】:

在我见过的大多数应用程序中,都没有使用任何方法,它是这样的:

Controller::get()
{
    Model::get_by_email($email);
}

Model::get_by_email($email)
{
    return fetch('SELECT user, name, etc FROM user where email=$email');
}

因此,所选字段在查询中被硬编码。它要么检索表中的每一列(某种“通用”请求),要么每个服务都有一个特定的请求来检索它需要的内容。

根据您使用的堆栈,您还将在控制器和模型之间有一个“服务”层(例如,在 Java 应用程序中)。 IMO 控制器不应该要求他们想要什么,他们只是假设服务/模型给了他们他们需要的东西。由于它是底层的某种形式的“客户端”,它不应该提出任何要求,而是使用提供的内容。

您的第二种方法与我描述的非常相似,但对我来说 $fields 数组似乎没有必要,因为正如您描述的那样,它的内容是静态的。

【讨论】:

  • 这也是方法#2,如果您在变量、硬编码或 ORM 中定义字段,它就没有关系。这个想法是看看是否更好地在控制器中发送这个字段,或者在模型中定义它们。对不起,如果我不够清楚。数组只是快速的伪代码,你是对的。
【解决方案2】:

这两种方法都是错误的,因为在这两种情况下,您都将域逻辑或存储逻辑暴露给表示层。

另外,你到底是从哪里读到需要控制器检索数据的 MVC 描述的?控制器的唯一职责是决定如何将用户输入传递到模型层(以及在少数情况下传递到当前视图)。

【讨论】:

  • 在方法 2 中,控制器只是将输入(电子邮件)传递给模型。基本上你说为什么这都是错误的,但没有提到应该使用哪种其他方法的任何积极反馈,这是一个很好的答案......
猜你喜欢
  • 2016-06-14
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多