模型中字段的最佳实践

时间:2013-01-24 21:42:30

标签: model-view-controller model controller field

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

  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');
    }
    
  3. 每种方法都有不同的优点。你觉得怎么样?

2 个答案:

答案 0 :(得分: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数组似乎没必要,因为正如你所描述的那样,它的内容是静态的。

答案 1 :(得分:0)

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

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