如果您正在使用mvc来构建用户配置文件,那么最好是使用条件语句来计算模型或控制器中函数的注释的显示类型,如下所示:
例如 我有3个班级
某些示例使用了缺少函数的伪代码
选项1
依赖于登录showComments
函数的用户类型,返回评论会返回不同的信息。
class user {
function isLoggedIn() { //Check if a user is logged in }
function getUserType() { // return user type }
function showComments($id) { //comments code }
}
class admin extends user {
function showComments($id) { //comments code }
}
然后使用控制器中的代码来确定是否依赖于登录的用户类型来显示?
$profileContent = $user->getOtherContent();
if ($user->isLoggedIn() && $user->getUserType() == "member") {
$member = new member();
$comments = $member->showComments($profileId);
}
elseif ($user->isLoggedIn() && $user->getUserType() == "admin") {
$admin = new admin();
$comments = $admin->showComments($profileId);
}
else
$comments = $user->showComments($profileId);
require 'templates/profile.php';
选项2
由于这是一个自定义框架,我可以将所有内容移动到模型中的一个函数中,并在用户中使用一个函数来检查要显示的注释类型:
abstract class user {
function isLoggedIn() { //Check if a user is logged in }
function getUserType() { // return user type }
}
class profile {
function showComments($profileId, $user) {
if (User::isLoggedIn() && User::getUserType() == "member") {
$comments = //database query and formatting for member
}
elseif (User::isLoggedIn() && User::getUserType() == "admin") {
$comments = //database query and formatting for admin
}
else
$comments = //database query and formatting for guest
return $comments;
}
}
使用如下控制器:
$profile = new profile($profileId);
$comments = $profile->showComments();
require 'templates/profile.php';
答案 0 :(得分:5)
技术上要么是正确的。 MVC模式是故意抽象的,关于模型的适当域与控制器的内容存在争议。
可能有更好的"根据您使用的确切框架来回答。否则,做你认为最有意义的事情。
更新 - 根据您的问题的变化,我想稍微调整一下我的答案:
对于选项1,设计模型更有意义:
class user {
function isLoggedIn() {}
function getUserType() {}
function showComments() {}
}
class admin extends user {
function getUserType() {}
function showComments() {}
}
class member extends user {
function getUserType() {}
function showComments() {}
}
在控制器中,$ user应该被实例化为管理员,成员或用户(这可以通过静态工厂或直接在控制器中完成)。之后你的控制器只是
if ($user->isLoggedIn()) {
$comments = $user->showComments($profileId);
}
(为了使这更聪明,可以将profileId设置为类属性(除非用户有多个配置文件?)
选项2,otoh,是模型到模型设计的巧妙使用。
我看到的唯一真正的区别是你如何概念化评论。您是否认为它们是用户的一部分(与配置文件的联系较弱)?或者是个人资料的一部分(与用户关系薄弱)?这两种方法都没有任何特殊的痛点,所以最好的选择是运行最适合你的那个。
答案 1 :(得分:2)
我相信这属于模特。我觉得用户身份验证和验证不属于Controller,最终它正在使用和验证数据,并且在模型中完成的MVC中。
由于其他原因,我认为这不适合控制器。它太聪明了。 Controller应该只知道它需要为View提供一些注释。为什么Controller需要知道登录的用户类型?它不应该,它应该只知道模型应该具有的数据。
答案 2 :(得分:2)
我尝试将处理数据(检索,操作等)的任何逻辑移动到模型中。这有时包括条件陈述。
就个人而言,我会为User类制作“showComments”和实例方法,但这实际上是一个意见问题(也被具有强烈意见的人称为“最佳实践”)。
当看起来谨慎时,我倾向于采用Fat Model, Skinny Controller方法。
答案 3 :(得分:2)
我想这完全取决于您对模型/视图/控制器所代表的含义的解释。这是我的2美分:
<强>模型强>
模型应该处理一个和只有一个应用程序逻辑。如果您有User模型,那么在该模型中应该只有与User相关的方法和属性。也就是说,如果可能的话,尽量不要在User模型中使用Comments逻辑。它们属于评论模型。在当前模型中调用另一个模型的条件将是应用程序另一部分的交叉。这就是控制器的用途。
模型应始终使用抽象结构进行响应。模型永远不应该以格式化或基于字符串的方式响应。它通常应该是一个数组,一个对象,一个简单的int(最好是一个模型常量)或一个布尔值。
<强>控制器强>
控制器应该处理输入数据(即使普通网页视图是输入数据),并且基于该数据,它应该调用应用程序逻辑。
在您的控制器中,您应该拥有与调用一个或另一个模型相关的所有条件。
基于抽象结果,它应该调用另一个模型,或者收集响应并将其合并,以便它可以作为简单结构传递给视图(尽量不将对象传递给视图,但是如果你面临将复杂结构作为模型返回值,将它们收集到一个数组中并将其传递给视图)。
查看强>
视图是三者中最直接的。它应该使用简单的指令格式化响应,这些指令只处理显示(或者在某些情况下,控制器响应的序列化或转换为可由另一个应用程序查看的内容 - 浏览器或调用api的第三个应用程序)
这一切都取决于你对MVC架构的喘息。尝试在整个项目中保持持续的开发“策略”。
希望有所帮助
答案 4 :(得分:1)
业务逻辑属于控制器。数据逻辑属于模型。
因此,如果您需要根据用户输入显示某些数据,那么它属于控制器。但是,实际获取/存储数据属于模型。