gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:21:26 25 4
gpt4 key购买 nike

我想问一下从模型而不是 Controller 中进行重定向是否是一个好方法。

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

这是一种不好的做法吗?

最佳答案

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

在更多 OOP 驱动的站点中,您通常会发现这作为带有“响应”对象的方法(比较 Symfony2 and HTTP Fundamentals ;注意 Symfony2 不是 MVC),但是,它通常也有一些类似的方法(例如参见 Difference between $this->render and $this->redirect Symfony2 )。

大多数情况下,这些“响应”对象是 Web 应用程序的核心,这在我眼中也是一个高级层。

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

那么如何将其融入到 MVC 中呢?在 HTTP 上下文中,这可以简化如下:

  • 响应是告诉用户去其他地方。
  • 如果用户不重要,应用程序可以直接转发 - 即执行不同的命令,客户端不会用于此目的,不需要重定向(子命令)。
  • 响应是:完成。然后:接下来请参阅此命令(以 URI 的形式)。

这听起来很像实际的重定向只是您在客户端通信的协议(protocol)级别上发送到客户端的一些输出。它属于您想要支持的协议(protocol)的接口(interface)。因此,不是进入模型,而是进入客户端界面,并且 MVC 应用程序内客户端界面的边界是 Controller AFAIK。

所以重定向可能是一个具有特殊含义的 View 值对象。为了使其在 HTTP MVC 中工作,您需要一个完整的 URL 抽象,大多数 PHP 框架和库都对此进行了大范围的研究,因为人们并不知道它是如何工作的。所以最后我想说:像 Symfony2 所做的那样,将其放置在高层组件中,放弃 MVC 并接受缺陷。

其他一切都很难实现,如果你尝试其他方法,则继续抽象的风险很高。

关于oop - MVC - 从模型重定向是否错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16669988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com