2

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

  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');
    }
    

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

4

2 回答 2

0

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

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数组似乎没有必要,因为正如您所描述的,它的内容是静态的。

于 2013-01-24T21:47:18.017 回答
0

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

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

于 2013-01-25T06:19:49.633 回答