>  기사  >  백엔드 개발  >  MVC 아키텍처의 의미와 책임 구분을 설명하는 예

MVC 아키텍처의 의미와 책임 구분을 설명하는 예

藏色散人
藏色散人앞으로
2022-01-07 14:09:407224검색

저는 최근 Yii Framework의 MVC 프레임워크를 사용하는 프로젝트를 담당했습니다. 처음에는 구조가 매우 견고하다고 생각했습니다.

하지만 비즈니스 로직에 대한 이해가 깊어지면서 문제의 심각성을 깨닫기 시작했습니다.

저는 MVC의 Controller를 오해했고, 과거 경험에 비추어 볼 때 모든 비즈니스 로직이 Controlleraction에 구현되어 있다고 당연하게 여겼습니다. action 中去实现。

于是,每一个 Controller代码都上千行,越来越臃肿

最后,我下定决心重构代码,起源是一个对外开放 API 接口的需求。

按照现在的架构,代码基本无法复用,我需要把很多功能再重复写一遍,这实在是无法接受。

面向对象编程不仅仅是课本上的名词啊!

真正开始实践才发现,要有面向对象意识,有全局观,是多么难得的一件事情。

MVC 아키텍처의 의미와 책임 구분을 설명하는 예

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

코드에는 수천 줄의 줄이 있으며 점점 더 부풀어 오르고 있습니다

.

마침내 코드를 리팩터링하기로 마음먹었습니다. 그 근원은 개방형 API 인터페이스의 필요성이었습니다.

현재 아키텍처에 따르면 코드는 기본적으로 재사용이 불가능합니다. 많은 함수를 계속해서 작성해야 하는데 이는 정말 용납할 수 없는 일입니다. 객체 지향 프로그래밍은 단순히 교과서에 나오는 용어가 아닙니다!

실제로 연습을 시작하고 나서야 객체 지향적 인식과 글로벌 관점을 갖는 것이 얼마나 드문 일인지 깨달았습니다.

MVC 아키텍처의 의미와 책임 구분을 설명하는 예 1 MVC

Model-View-Controller(MVC)란 정확히 무엇인가요?

디자인 프레임워크(디자인 패턴)입니다.

MVC의

목표

사용자 인터페이스 고려 사항에서 비즈니스 로직 을 분리하는 것입니다. 이렇게 하면 개발자는 다른 부분에 영향을 주지 않고 각 부분을 더 쉽게 변경할 수 있습니다.

MVC에서

  • 모델은
데이터 및 비즈니스 규칙을 나타냅니다.
  • 뷰에는 텍스트, 양식
  • 등의

    사용자 인터페이스 요소가 포함됩니다. /li>
  • 뷰 li>
  • 컨트롤러는 모델과 뷰 간의

    통신을 관리합니다.

  • MVC는 다양한 프로그래밍 언어로 구현됩니다. 예를 들어 J2EE 애플리케이션 개발에서

    View는 jsp로 구현될 수 있습니다. 현재 일반적으로 Struts 모델로 구현됩니다. 달성할 Entity Bean. 2 어떤 문제가 발생했나요?

    Yii Framework는 Ruby on Rails의 ActiveRecord(AR code>)를 기반으로 하는 인기 있는 PHP 프레임워크입니다. ) 개념. 🎜🎜데이터베이스의 모든 <code>테이블AR 클래스를 사용하여 추가, 삭제, 수정 및 쿼리 작업을 쉽게 수행할 수 있습니다. 🎜🎜AR을 모델로 취급하며 models라는 디렉터리에 배치하는 것을 권장합니다. 🎜🎜그래서 테이블에 해당하는 AR을 자동으로 생성한 후에는 이미 모델 레이어가 있다고 당연하게 여겼습니다. 🎜🎜사실 🎜🎜AR은 모델 레이어🎜🎜가 아닌 DAO(데이터 액세스 레이어)일 뿐입니다. 🎜🎜우리의 거의 모든 업무는 컨트롤러에 위치합니다: 사용자가 제출한 양식에 대해 다양한 논리적 판단을 내리고, 계산을 수행하고, AR을 인스턴스화하여 데이터를 저장합니다...🎜 🎜🎜컨트롤러에는 여러 개의 action이 있기 때문에 각 action에는 이러한 비즈니스 처리가 있습니다. 🎜🎜드디어 컨트롤러 코드가 1000줄을 초과한 것을 발견했습니다. 🎜🎜갑자기 리더는 기존의 기존 시스템이 타사 인터페이스를 호출하고 제공할 수 있도록 API를 개방해야 한다고 말했습니다. 🎜🎜제3자는 매개변수만 제공하면 되며, 이 시스템은 결과 값만 제공하므로 비즈니스 처리에는 관심이 없습니다. 🎜🎜나쁜 점은 컨트롤러가 이미 해당 서비스를 구현했지만 양식 제출을 허용한다는 것입니다. 어떻게 SOAP xml 문서도 허용할 수 있습니까? 🎜🎜🎜🎜컨트롤러는 콘돔과 마찬가지로 최대한 얇아야 합니다. 🎜🎜🎜🎜책임은 🎜🎜사용자 입력을 수락한 다음 처리를 위해 즉시 다른 클래스에 전달해야 합니다🎜🎜. 🎜🎜이런 식으로 Controller는 서로 다른 인터페이스를 제공하는 역할만 담당하므로 비즈니스 로직을 분리할 수 있고 분리된 비즈니스를 쉽게 재사용할 수 있습니다. 🎜🎜이 분리된 사업 부분은 누가 처리하나요? 대답은 🎜Model🎜이어야 합니다. 🎜🎜🎜3 View🎜🎜🎜🎜View🎜의 책임은 상대적으로 명확하며 디스플레이를 담당합니다. 🎜🎜🎜🎜디스플레이 인터페이스와 관련이 없는 모든 항목은 뷰에 표시되어서는 안 됩니다. 🎜🎜🎜🎜따라서 일반적으로 🎜🎜 🎜View 🎜에는 복잡한 판단문이나 복잡한 계산 과정이 없어야 합니다. 🎜🎜🎜🎜간단한 루프 문과 서식 지정 문을 사용할 수 있습니다. 예를 들어, 블로그 홈페이지의 텍스트 목록은 일종의 루프입니다. 🎜🎜PHP 웹 애플리케이션의 경우 🎜🎜HTML이 View🎜🎜의 주요 콘텐츠입니다. 🎜🎜View🎜🎜는 Model🎜🎜의 쓰기 메소드를 호출하면 안 됩니다. 🎜

    즉, View는 Model에서 데이터를 읽기만 하고 Model을 다시 작성하지는 않습니다.

    그래서 뷰와 모델은 분리될 수 없다고 말합니다.

    또한 $_GET$_POST는 View에서 직접 액세스할 수 없으며 컨트롤러를 통해 View에 전달해야 합니다. $_GET$_POST,应该由Controller传递给View。

    此外,View一般没有任何准备数据处理的内容,如查询数据库等。

    这些一般是放在Controller里面,并以变量的形式传给视图。

    也就是说,视图里面要用到的数据,就是一个变量

    4 Model的职责

    对于Model而言,最主要就是保存和输出信息

    比如,Post类必然有一个用于保存博客文章标题的title属性,必然有一个删除的操作,这都是Model的内容。

    数据、行为、方法是Model的主要内容

    实际工作中,Model是MVC中代码量最大

    Model是逻辑最复杂的地方,因为应用的业务逻辑也要在这里表示。

    注意将Model与Controller区分开。

    Model是处理业务方面的逻辑,Controller只是简单的协调Model和View之间的关系。

    只要是与业务有关的,就该放在Model里面。

    数据校验、public常量和变量,都应该放在model层,

    也就是说,有可能被重复使用的属性或方法,都应该放在model层,一次定义,到处使用。

    Model不应该访问request、session以及其他环境数据,这些应该由Controller注入。

    好的设计,应该是胖Model,瘦Controller

    5 Controller的职责

    对于Controller,主要是响应用户请求,决定使用什么视图,需要准备什么数据用来显示

    因此,对于request的访问代码,应该放在Controller里面,比如$_GET$_POST

    또한

    View에는 일반적으로 데이터베이스 쿼리 등 데이터 처리를 준비하는 콘텐츠가 없습니다.

    이것들은 일반적으로 컨트롤러에 배치되고 변수 형태로 뷰에 전달됩니다.

    즉,

    뷰에 사용되는 데이터는 변수

    입니다.

    4가지 모델의 책임

    모델에게 가장 중요한

    은 정보를 저장하고 출력하는 일

    입니다.

    예를 들어 Post 클래스에는 블로그 게시물의 제목을 저장하는 데 사용되는 title 속성이 있어야 하며, 삭제 작업이 있어야 합니다. 이는 모델의 모든 내용입니다.

    데이터, 동작, 메소드는 Model

    의 주요 콘텐츠입니다.
    실제 작업에서는
    🎜모델이 MVC🎜🎜에서 가장 많은 코드량을 가지고 있습니다. 🎜🎜모델은 로직에서 가장 복잡한 부분입니다. 애플리케이션의 비즈니스 로직도 여기에 표현되어야 하기 때문입니다. 🎜🎜모델과 컨트롤러를 구별하는데 주의하세요. 🎜🎜🎜🎜Model은 비즈니스 로직을 처리하고 Controller는 단순히 Model과 View 간의 관계를 조정합니다. 🎜🎜🎜🎜비즈니스와 관련된 것이라면 모델에 넣어야 합니다. 🎜🎜🎜🎜데이터 검증🎜🎜, public🎜🎜 상수 및 변수🎜🎜는 모두 모델 레이어에 배치해야 합니다. 🎜🎜즉, 재사용할 수 있는 속성이나 메소드는 모델 레이어에 배치해야 합니다. 모든 곳에서 사용됩니다. 🎜🎜모델은 요청, 세션 및 기타 환경 데이터에 액세스해서는 안 되며 컨트롤러에 의해 주입되어야 합니다. 🎜🎜좋은 디자인은 🎜🎜뚱뚱한 모델과 얇은 컨트롤러🎜🎜여야 합니다. 🎜

    Controller의 5가지 책임🎜🎜🎜 🎜Controller🎜에서는 주로 🎜🎜사용자 요청에 응답하고, 사용할 뷰를 결정하고, 표시를 위해 어떤 데이터를 준비해야 하는지 결정합니다🎜🎜 . 🎜🎜따라서 🎜🎜요청에 대한 액세스 코드는 $_GET, $_POST 등과 같이 Controller🎜🎜에 배치되어야 합니다. . 🎜🎜컨트롤러는 사용자 요청 데이터를 얻는 것으로 제한되어야 하며 🎜🎜데이터에 대한 작업이나 전처리를 수행해서는 안 되며🎜🎜 이는 모델 내부에 배치되어야 합니다. 🎜🎜데이터 쓰기 작업을 완료하려면 Model 클래스의 메서드를 호출해야 합니다. 🎜🎜사용자 요청에 따라 뷰 렌더링이 호출됩니다. 🎜🎜또한 일반적으로 🎜🎜 HTML 코드 및 기타 프레젠테이션 레이어 항목이 없어야 하며 🎜🎜 이는 뷰의 콘텐츠여야 합니다. 🎜🎜🎜6 Enlightenment🎜🎜🎜Yii Framework의 공식 문서에는 다음 단락이 있습니다. 🎜🎜🎜잘 설계된 MVC 애플리케이션에서 컨트롤러는 종종 매우 얇아서 모델은 수십 줄만 포함합니다. 🎜🎜🎜간단히 말하면 🎜Rich Model이 더 좋습니다🎜. 🎜🎜🎜🎜

    위 내용은 MVC 아키텍처의 의미와 책임 구분을 설명하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 awaimai.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제