上海网站定制设计装饰网站
web/
2025/10/7 2:26:06/
文章来源:
上海网站定制设计,装饰网站,中企动力全网门户网站,建设好网站能赚到钱吗来源#xff1a;https://www.awaimai.com/873.html 歪麦博客最近负责一个项目#xff0c;用了 Yii Framework 的 MVC 框架#xff0c;刚开始自以为结构很稳健。但是随着对业务逻辑理解的深入#xff0c;才开始意识到问题的严重。我错误地理解了 MVC 中的 Controller…来源https://www.awaimai.com/873.html 歪麦博客最近负责一个项目用了 Yii Framework 的 MVC 框架刚开始自以为结构很稳健。但是随着对业务逻辑理解的深入才开始意识到问题的严重。我错误地理解了 MVC 中的 Controller想当然地根据以往的经验把所有的业务逻辑都放在 Controller 的 action 中去实现。于是每一个 Controller 的代码都上千行越来越臃肿。最后我下定决心重构代码起源是一个对外开放 API 接口的需求。按照现在的架构代码基本无法复用我需要把很多功能再重复写一遍这实在是无法接受。面向对象编程不仅仅是课本上的名词啊真正开始实践才发现要有面向对象意识有全局观是多么难得的一件事情。1 到底什么是 MVC模型-视图-控制器(MVC)是一种设计框架(设计模式)。MVC 的目标是将业务逻辑从用户界面的考虑中分离。这样开发者就可以更容易地改变每一部分而不会影响其他。在 MVC 中Model 代表数据和业务规则View 包含了用户界面元素例如文本表单等Controller 则管理模型和视图中的通信。MVC 在各种编程语言中均有实现例如 J2EE 应用开发中View 可能由 jsp 实现Controller 是一个 servlet现在一般用 Struts 实现Model 则是由一个实体 Bean 来实现。2 我遇到了什么问题Yii Framework 是一个流行的 PHP 框架它借鉴了 Ruby on Rails 的 ActiveRecord(AR) 概念。数据库中的每一个 table 都可以用 AR 类来方便地进行增删改查操作。它把 AR 当做 Model并推荐放在一个名为 models 的目录下面。于是我在自动生成表对应的 AR 之后便望文生义想当然地认为已经拥有了 Model 层。其实AR只不过是 DAO (数据访问层)并不是 Model 层。我们的业务几乎全放在了 Controller 里对用户提交上来的表单进行各种逻辑判断进行计算实例化 AR 对数据进行存储……因为一个 Controller 中会有多个 action每个 action 都有这样的业务处理。最后我发现我的 Controller 代码已经超过了 1000 行。突然有一天leader 说我们这个系统要开放 API 给现有的旧系统调用要给第三方接口。第三方只是要给定一个参数本系统给出个结果值而已这其中的业务处理它是不关心的。坏就坏在这里Controller 已经实现了那些业务但它是接受表单提交的怎样能够也接受 SOAP 的 xml 文档呢Controller 和套套一样应该越薄越好。它的职责应该只是接受用户的输入然后立刻转发给别的类来处理。这样 Controller 只负责提供不同的接口我们才能算是将业务逻辑分离出去而分离出去的业务也很容易进行重用。分离出来的这部分业务由谁来处理呢答案应该是 Model。3 View的职责View部分比较明确就是负责显示。一切与显示界面无关的东西都不应该出现在view里面。因此View 中一般不应该出现复杂的判断语句以及复杂的运算过程。可以有简单的循环语句、格式化语句。比如博客首页的文字列表就是一种循环。对于PHP的Web应用而言HTML是View中的主要内容。View应该从不调用Model的写方法。也就是说View只从Model中读取数据但不改写Model。所以我们说View和Model是老死不相往来的。而且View中不直接访问$_GET和$_POST应该由Controller传递给View。此外View一般没有任何准备数据处理的内容如查询数据库等。这些一般是放在Controller里面并以变量的形式传给视图。也就是说视图里面要用到的数据就是一个变量。4 Model的职责对于Model而言最主要就是保存和输出信息。比如Post类必然有一个用于保存博客文章标题的title属性必然有一个删除的操作这都是Model的内容。数据、行为、方法是Model的主要内容。实际工作中Model是MVC中代码量最大。Model是逻辑最复杂的地方因为应用的业务逻辑也要在这里表示。注意将Model与Controller区分开。Model是处理业务方面的逻辑Controller只是简单的协调Model和View之间的关系。只要是与业务有关的就该放在Model里面。Model不应该访问request、session以及其他环境数据这些应该由Controller注入。好的设计应该是胖Model瘦Controller。5 Controller的职责对于Controller主要是响应用户请求决定使用什么视图需要准备什么数据用来显示。因此对于request的访问代码应该放在Controller里面比如$_GET、$_POST等。Controller应该仅限于获取用户请求数据不应该对数据有任何操作或预处理这应该放在 Model 里面。对于数据的写操作要调用Model类的方法完成。对于用户请求的响应要调用视图渲染。此外一般不要有HTML代码等其他表现层的东西这应该是属于View的内容。6 启示Yii Framework 的官方文档中有这么一段In a well-designed MVC application, controllers are often very thin, containing probably only a few dozen lines of code; while models are very fat, containing most of the code responsible for representing and manipulating the data.简言之Rich Model is Better。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88235.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!