Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiele zur Erläuterung der Bedeutung und Aufgabenteilung der MVC-Architektur

Beispiele zur Erläuterung der Bedeutung und Aufgabenteilung der MVC-Architektur

藏色散人
藏色散人nach vorne
2022-01-07 14:09:407224Durchsuche

Ich war kürzlich für ein Projekt verantwortlich, das das MVC-Framework von Yii Framework nutzte. Zuerst dachte ich, die Struktur sei sehr robust.

Aber als ich mein Verständnis der Geschäftslogik vertiefte, begann ich, die Ernsthaftigkeit des Problems zu erkennen.

Ich habe Controller in MVC falsch verstanden und aufgrund früherer Erfahrungen davon ausgegangen, dass die gesamte Geschäftslogik in der Aktion von Controller implementiert wurde. action 中去实现。

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

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

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

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

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

Beispiele zur Erläuterung der Bedeutung und Aufgabenteilung der MVC-Architektur

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

Der

Code jedes

Controllers

besteht also aus Tausenden von Zeilen, was immer mehr aufgebläht wird

.

Schließlich habe ich mich dazu entschlossen, den Code zu überarbeiten. Der Ursprung lag in der Notwendigkeit einer offenen API-Schnittstelle.

Nach der aktuellen Architektur ist es grundsätzlich unmöglich, den Code wiederzuverwenden. Ich muss viele Funktionen immer wieder schreiben, was wirklich inakzeptabel ist. Objektorientierte Programmierung ist nicht nur ein Begriff aus Lehrbüchern!

Erst als ich richtig angefangen habe zu praktizieren, wurde mir klar, wie selten es ist, objektorientiertes Bewusstsein und eine globale Perspektive zu haben.

Beispiele zur Erläuterung der Bedeutung und Aufgabenteilung der MVC-Architektur. 1 Was genau ist MVC? Model-View-Controller (MVC) ist ein

Design-Framework (Entwurfsmuster)

.

Das

Ziel

von

MVC besteht darin, die Geschäftslogik

von Überlegungen zur Benutzeroberfläche zu trennen.

Auf diese Weise können Entwickler jeden Teil einfacher ändern, ohne die anderen zu beeinträchtigen.

In MVC stellt

  • Modell
Daten und Geschäftsregeln

dar;

  • Ansicht enthält Benutzeroberflächenelemente, wie Text, Formulare usw.; /li>
  • View li>
  • Controller verwaltet die
  • Kommunikation

    zwischen dem Modell und der Ansicht.

    MVC wird beispielsweise in der J2EE-Anwendungsentwicklung implementiert.

    View ist ein Servlet, das jetzt im Allgemeinen mit Struts implementiert wird Zu erreichende Entitäts-Bean. 2 Auf welches Problem bin ich gestoßen?

    Yii Framework ist ein beliebtes PHP-Framework, das auf ActiveRecord(AR code>) von Ruby on Rails basiert ) Konzept. <strong><span style="color: #ff0000;">Jede <code>Tabelle in der Datenbank kann die AR-Klasse verwenden, um problemlos Hinzufügungs-, Lösch-, Änderungs- und Abfragevorgänge durchzuführen. Es behandelt AR als Modell und empfiehlt, es in einem Verzeichnis namens models abzulegen.

    🎜Als ich also automatisch die der Tabelle entsprechende AR generierte, ging ich davon aus, dass ich bereits über die Modellebene verfügte. 🎜🎜Eigentlich ist 🎜🎜AR nur eine DAO (Datenzugriffsschicht), keine Modellschicht🎜🎜. 🎜🎜Fast unser gesamtes Geschäft ist im Controller untergebracht: trifft verschiedene logische Beurteilungen der von Benutzern übermittelten Formulare, führt Berechnungen durch und instanziiert AR, um die Daten zu speichern ... 🎜 🎜🎜Da es in einem Controller mehrere Aktionen gibt, verfügt jede Aktion über eine solche Geschäftsverarbeitung. 🎜🎜Schließlich stellte ich fest, dass mein Controller-Code mehr als 1000 Zeilen umfasste. 🎜🎜Plötzlich sagte der Leiter eines Tages, dass unser System APIs für bestehende alte Systeme öffnen sollte, um Schnittstellen von Drittanbietern aufzurufen und bereitzustellen. 🎜🎜Der Dritte muss nur einen Parameter angeben, und dieses System gibt nur einen Ergebniswert an. Die Geschäftsabwicklung ist ihm egal. 🎜🎜Das Schlimme ist, dass der Controller diese Dienste bereits implementiert hat, aber Formularübermittlungen akzeptiert. Wie kann er auch SOAP-XML-Dokumente akzeptieren? 🎜🎜🎜🎜Controller sollten, wie Kondome, so dünn wie möglich sein. 🎜🎜🎜🎜Seine Verantwortung sollte 🎜🎜 einfach Benutzereingaben akzeptieren und diese dann sofort zur Verarbeitung an andere Klassen weiterleiten 🎜🎜. 🎜🎜Auf diese Weise ist der Controller nur für die Bereitstellung verschiedener Schnittstellen verantwortlich, sodass wir die Geschäftslogik trennen und das getrennte Geschäft problemlos wiederverwenden können. 🎜🎜Wer wird diesen abgetrennten Teil des Geschäfts abwickeln? Die Antwort sollte 🎜Model🎜 lauten. 🎜🎜🎜3 Die Verantwortung von View🎜🎜🎜🎜View🎜 ist relativ klar, es ist für die Anzeige verantwortlich. 🎜🎜🎜🎜Alles, was nichts mit der Anzeigeoberfläche zu tun hat, sollte nicht in der Ansicht erscheinen. 🎜🎜🎜🎜Daher sollte 🎜🎜 im Allgemeinen keine komplexen Urteilsaussagen oder komplexen Berechnungsvorgänge in 🎜Ansicht 🎜 enthalten. 🎜🎜🎜🎜Sie können einfache Schleifenanweisungen und Formatierungsanweisungen verwenden. Beispielsweise ist die Textliste auf der Blog-Homepage eine Art Schleife. 🎜🎜Für PHP-Webanwendungen ist 🎜🎜HTML der Hauptinhalt in View🎜🎜. 🎜🎜View🎜🎜 sollte niemals die Schreibmethode von Model🎜🎜 aufrufen. 🎜

    Mit anderen Worten: View liest nur Daten aus dem Modell, schreibt das Modell jedoch nicht neu.

    Wir sagen also, dass Ansicht und Modell untrennbar miteinander verbunden sind.

    Darüber hinaus wird auf $_GET und $_POST nicht direkt in View zugegriffen und sollte vom Controller an View übergeben werden. $_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

    Darüber hinaus verfügt

    View im Allgemeinen über keine Inhalte zur Vorbereitung der Datenverarbeitung, wie z. B. Abfragen der Datenbank usw.

    Diese werden normalerweise im Controller platziert und in Form von Variablen an die Ansicht übergeben.

    Mit anderen Worten, die in der

    Ansicht zu verwendenden Daten sind eine Variable

    .

    4 Verantwortlichkeiten des Models

    Für

    Model ist

    das Wichtigste das Speichern und Ausgeben von Informationen

    .

    Zum Beispiel muss die Post-Klasse über ein title-Attribut verfügen, das zum Speichern des Titels des Blog-Beitrags verwendet wird, und es muss ein Löschvorgang vorhanden sein. Dies sind alle Inhalte des Modells.

    Daten, Verhalten und Methoden sind der Hauptinhalt von Model

    .
    In der tatsächlichen Arbeit verfügt
    🎜Model über die größte Codemenge in MVC🎜🎜. 🎜🎜Modell ist der komplexeste Teil der Logik, da hier auch die Geschäftslogik der Anwendung ausgedrückt werden muss. 🎜🎜Achten Sie darauf, Modell und Controller zu unterscheiden. 🎜🎜🎜🎜Model verwaltet die Geschäftslogik und Controller koordiniert lediglich die Beziehung zwischen Model und View. 🎜🎜🎜🎜Solange es einen geschäftlichen Bezug hat, sollte es im Modell platziert werden. 🎜🎜🎜🎜Datenüberprüfung🎜🎜, öffentliche🎜🎜 Konstanten und Variablen🎜🎜 sollten alle in der Modellebene platziert werden, 🎜🎜Mit anderen Worten, Attribute oder Methoden, die wiederverwendet werden können, sollten nach der Definition in der Modellebene platziert werden. überall verwendet. 🎜🎜Das Modell sollte nicht auf Anfrage-, Sitzungs- und andere Umgebungsdaten zugreifen, diese sollten vom Controller eingefügt werden. 🎜🎜Gutes Design sollte 🎜🎜Fat Model und Thin Controller🎜🎜 sein. 🎜

    5 Verantwortlichkeiten des Controllers🎜🎜🎜Für 🎜Controller🎜 reagiert er hauptsächlich auf Benutzeranfragen, entscheidet, welche Ansicht verwendet werden soll und welche Daten für die Anzeige vorbereitet werden müssen🎜🎜 . 🎜🎜Daher 🎜🎜Der Zugriffscode für request sollte im Controller platziert werden🎜🎜, wie z. B. $_GET, $_POST usw . 🎜🎜Der Controller sollte sich auf den Erhalt von Benutzeranforderungsdaten beschränken, 🎜🎜sollte keine Vorgänge oder Vorverarbeitungen an Daten durchführen🎜🎜, dies sollte innerhalb des Modells platziert werden. 🎜🎜Für Datenschreibvorgänge ist es zum Abschluss erforderlich, die Methode der Model-Klasse aufzurufen. 🎜🎜Als Reaktion auf Benutzeranfragen wird das Rendern von Ansichten aufgerufen. 🎜🎜Außerdem sollte im Allgemeinen 🎜🎜 kein HTML-Code oder andere Dinge auf der Präsentationsebene vorhanden sein 🎜🎜, dies sollte der zur Ansicht gehörende Inhalt sein. 🎜🎜🎜6 Aufklärung🎜🎜🎜In der offiziellen Dokumentation von Yii Framework gibt es diesen Absatz: 🎜🎜🎜In einer gut gestalteten MVC-Anwendung sind Controller oft sehr dünn und enthalten wahrscheinlich nur ein paar Dutzend Codezeilen, während dies bei Modellen der Fall ist sehr fett, enthält den größten Teil des Codes, der für die Darstellung und Bearbeitung der Daten verantwortlich ist 🎜🎜🎜Kurz gesagt: 🎜Rich Model is Better🎜. 🎜🎜🎜🎜

    Das obige ist der detaillierte Inhalt vonBeispiele zur Erläuterung der Bedeutung und Aufgabenteilung der MVC-Architektur. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:awaimai.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen