Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop MVC-从模型重定向是否错误_Oop_Design Patterns_Model View Controller - Fatal编程技术网

Oop MVC-从模型重定向是否错误

Oop MVC-从模型重定向是否错误,oop,design-patterns,model-view-controller,Oop,Design Patterns,Model View Controller,我想问一下,从模型而不是控制器中重定向是否是一种好方法 我想这样做的原因是,从模型进行单元测试重定向(我只是在测试中将模拟重定向器对象传递给模型)比从控制器进行单元测试更容易。它还使控制器更薄,因为我在控制器中所做的就是创建模型的实例并从请求对象传递参数。控制器中没有一个这样的if/else 这种做法不好吗 控制器和模型都不应在任何地方重定向任何内容。HTTP位置头是响应的形式,它严格属于视图的权限 模型层处理业务逻辑,它应该完全忽略表示层的存在 基本上可以归结为:控制器处理输入,视图处理输出。

我想问一下,从模型而不是控制器中重定向是否是一种好方法

我想这样做的原因是,从模型进行单元测试重定向(我只是在测试中将模拟重定向器对象传递给模型)比从控制器进行单元测试更容易。它还使控制器更薄,因为我在控制器中所做的就是创建模型的实例并从请求对象传递参数。控制器中没有一个这样的if/else


这种做法不好吗

控制器和模型都不应在任何地方重定向任何内容。HTTP位置头是响应的形式,它严格属于视图的权限

模型层处理业务逻辑,它应该完全忽略表示层的存在

基本上可以归结为:控制器处理输入,视图处理输出。HTTP头是输出的一部分

注意:在处理Rails克隆时,通常会看到在“控制器”中执行重定向。这是因为他们所谓的“控制者”实际上是观点和控制者责任的结合。这是选择将真实视图替换为简单模板作为空间坐标轴第三方的副作用


我认为您可以为应用程序工作流或导航(在模型层中)创建一个模型,然后让控制器将工作流/导航模型中的不同概念转换为要显示的视图

您的工作流类/模块可以了解用户可以使用的不同活动/阶段/步骤,并且可以像状态机一样对应用程序进行建模。因此,您的控制器将调用此模块以更新状态,并将收到一个响应,告知控制器应转到哪个活动/阶段/步骤


这样,您的工作流模型很容易测试,但它仍然不知道您的视图技术。

我会说是的,它是错误的。据我所知,当模型管理数据和视图管理布局(即数据应如何显示)时,控制器只负责HTTP请求/响应管理(在web应用的情况下),我认为重定向通常属于该层

通用框架中的示例

:

返回$this->redirect($this->generateUrl('homepage');
:

返回“重定向:/约会”;

大多数情况下,在Web应用程序中(无论是否为MVC),重定向都是在高层实现的。在非OOP代码中,这通常是一个高级全局函数,它非常了解全局静态以及其中表示请求和响应的内容

在更多OOP驱动的站点中,您会发现这通常是一种带有“response”对象的方法(比较;注意Symfony2不是MVC),然而,它通常也有一些类似的方法(例如,请参阅)

在我看来,这些“响应”对象通常是web应用程序中的核心,这也是一个高级层

从测试的角度来看——尤其是集成测试——您通常不需要专门测试重定向。您应该测试重定向功能通常在HTTP层上工作,以便应用程序中使用它的部分可以依赖它。常见的问题是没有真正遵循HTTP/1.1规范中给出的建议,比如提供带有重定向的响应体。一个运行良好的Web应用程序应该尊重这一点。使用完全限定的URI也是如此

那么,这一切是如何融入MVC的呢?在HTTP上下文中,这可以简化为以下内容:

  • 响应是告诉用户去其他地方
  • 如果用户不重要,应用程序可以直接转发,也就是说,执行不同的命令时,客户端将不用于转发,不需要重定向(sub命令)
  • 答案是:完成。然后:请参见下面这个命令(以URI的形式)
这听起来很像实际的重定向只是在客户端通信的协议级别上发送给客户端的一些输出。它属于您想要支持的协议的接口。因此,不是进入模型,而是进入客户机接口,MVC应用程序中客户机接口的边界是控制器AFAIK

因此重定向可能是一个具有特殊含义的视图值对象。要在HTTPMVC中实现这一点,您需要一个完整的URL抽象,这是大多数PHP框架和库都要做的,因为还不知道它是如何工作的。最后我要说的是:按照Symfony2所做的去做,把它放在一个高级层组件中,放弃MVC,接受缺陷


其他一切都很难实现,如果你尝试其他方法,那么不停止抽象是很高的风险。

这些想法中提到了许多评论,因此这里是一个总结:

确定是否需要重定向以及重定向应该是什么的逻辑属于控制器。模型只是获取视图所需的数据。这是在您决定渲染哪个视图后发生的。将重定向视为执行不同控制器操作的指令

我使用ASP.NET MVC,控制器为此生成重定向结果,这是完全可单元测试的。我不知道您的框架支持什么,但MVC会这样做:

public class MyController : Controller {

    public ActionResult ShowInfo(string id) {
         if( id == null ) {
             return new RedirectResult("searchpage");
         } else {
             return new ViewResult("displayInfo");
         }
    }
}
在单元测试中,实例化MyController并检查结果的类型以及url或视图名称(可选)

是否实际执行重定向不是单元测试的问题——这本质上是确保框架正常工作。您需要测试的是您是否给出了正确的指令(即重定向)和cor