我想知道是否有最佳做法来设置模型将检索的字段。在这两种不同的方法之间(伪代码):
在控制器中定义值并将它们发送给模型。
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');
}
模型方法定义要检索的字段。
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');
}
每种方法都有不同的优点。你觉得怎么样?
答案 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描述?控制器唯一的责任是决定如何将用户输入传递给模型层(在少数情况下 - 传递给当前视图)。