条件语句是否属于phpmvc中的模型或控制器


Do conditional statements belong in the model or controller in a php mvc?

如果你正在使用mvc来构建用户配置文件,那么在模型或控制器中的函数中使用条件语句来计算注释的显示类型会更好吗:

例如我有三个班

  • 评论
  • 成员
  • 管理员(扩展成员)

一些例子使用了函数缺失的伪代码

选项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';

从技术上讲,两者都是正确的。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,是对模型到模型设计的明智使用。

我看到的唯一真正的区别是你如何概念化评论。你认为他们是用户的一部分吗(与个人资料的联系很弱)?还是个人资料的一部分(与用户关系较弱)?这两种方法都没有我直接看到的任何特定的痛点,所以最好的选择是选择对你来说最有意义的方法。

我相信这属于模型。我觉得用户身份验证和验证不属于控制器,最终它是在模型中使用和验证数据和MVC。

由于另一个原因,我认为这不适合担任财务总监。它太聪明了。控制器应该只知道它需要向视图提供一些注释。为什么控制器需要知道登录的用户类型?它不应该,它应该只知道模型说它应该拥有的数据。

我试图将处理数据(检索、操作等)的任何逻辑移动到模型中。这有时包括条件语句。

就我个人而言,我会为User类创建"showComments"和实例方法,但这实际上是一个意见问题(也被有强烈意见的人称为"最佳实践")。

当看起来很谨慎的时候,我倾向于采用胖模型,瘦控制器的方法。

我想这一切都取决于你对模型/视图/控制器的理解。这是我的2美分:

型号

一个模型应该处理一个且只能处理一个应用程序逻辑。如果您有一个User模型,那么在该模型中应该只有与User相关的方法和属性。也就是说,如果可能的话,尽量不要在用户模型中使用Comments逻辑。它们属于"注释"模型。在当前模型中创建调用另一个模型的条件将是对应用程序另一部分的交叉。这就是控制器的作用。

模型应始终使用抽象结构进行响应。模型永远不应该用格式化的或基于字符串的东西来响应。它通常应该是一个数组、一个对象、一个简单的int(最好是一个模型常数)或一个布尔值。

控制器

控制器应该处理输入数据(即使是普通的网页视图也是输入数据),并且基于该数据,它应该调用应用程序逻辑。

在您的控制器中,您应该具有与调用一个或另一个模型相关的所有条件。

根据抽象结果,它应该调用另一个模型,或者收集响应并合并,以便将其作为简单结构传递到视图(尽量不要将对象传递到视图,但如果您面临作为模型返回值的复杂结构,请将它们收集到一个数组中并传递到视图)。

查看

这是三种观点中最直接的一种。它应该用简单的指令格式化响应,这些指令只处理显示(或者在某些情况下,将控制器响应序列化或转换为另一个应用程序(浏览器或调用api的第三个应用程序)


这一切都归结为你对MVC体系结构的惊叹。试着在整个项目中保持一个持续的开发"策略"。

希望它能帮助

业务逻辑属于控制器。数据逻辑属于模型。

因此,如果您需要根据用户输入显示某些数据,则该数据属于控制器。然而,实际获取/存储数据属于模型。