我应该从 MVC 框架中的控制器或模型中调用 redirect() 吗?

Posted

技术标签:

【中文标题】我应该从 MVC 框架中的控制器或模型中调用 redirect() 吗?【英文标题】:Should I call redirect() from within my Controller or Model in an MVC framework? 【发布时间】:2011-06-03 20:10:54 【问题描述】:

我正在使用 MVC php 框架 Codeigniter,我有一个直截了当的问题,即从哪里调用 redirect():控制器还是模型?

场景: 用户导航到 www.example.com/item/555。在我的模型中,我在项目数据库中搜索 ID 为 555 的项目。如果找到该项目,我会将结果返回给我的控制器。但是,如果找不到某个项目,我想将用户重定向到某个地方。对 redirect() 的调用应该来自模型内部还是控制器内部?为什么?

【问题讨论】:

【参考方案1】:

你的模型不应该返回 false,你应该像这样检查你的控制器:

class SampleModel extends Model

    //Construct

    public function FetchItem($id)
    
        $result = $this->db->select("*")->from("table")->where("item_id",$id)->get();
        if($result->num_rows() == 0)
        
             return false;
        
        //return result
    

在你的控制器中做:

function item($id)

     $Item = $this->SampleModel->FetchItem($id);

     if(!$Item)
     
          redirect("class/error/no_item");
     

模型仅用于数据,要么返回标准结果,例如键/值对象或布尔值。

所有逻辑都应由控制器处理/控制。

模型不是特定于页面的,而是在整个应用程序中全局使用,因此如果另一个类/方法使用该模型,它可能会被重定向到不正确的位置,因为它是您网站的不同部分。

【讨论】:

感谢罗伯特和 jmort。这是我一直在寻找的直截了当的答案。【参考方案2】:

控制器似乎是调用重定向的最佳位置,因为控制器通常将调用委托给模型、视图或在您的情况下为另一个控制器。

但是,您应该使用最适合您的应用程序以及将来更容易维护的东西,但也要考虑到规则的存在是有原因的。

简而言之,如果同事要尝试修复代码中的错误,“理性人”标准会怎么说?他们中的大多数人最有可能在哪里寻找您的重定向?

另外,您说您已经将结果返回到您的控制器...也许这就是您应该进行重定向的地方...

【讨论】:

大声笑,主要不是 J2EE/Java,但我在大学里学了一些 .NET 并有一些 .NET 朋友 :)

以上是关于我应该从 MVC 框架中的控制器或模型中调用 redirect() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

我应该在 Laravel MVC 中的哪里保存模型?

Symfony2 和其他 MVC 框架中的模型?

C# MVC 架构,我应该从 MODEL 还是 CONTROLLER 调用存储过程

在实现 MVC 时,应用程序的哪一部分应该调用 DAO 中的方法? [关闭]

PHP MVC 原理

将数据从 MVC 控制器传递到 PHP 中的视图