3 Stimmen

PHP MVC: Brauche ich wirklich einen Controller?

Meine Frage ist einfach, aber (ich vermute) schwer zu beantworten:

Brauche ich wirklich ein vollständiges Model-View-Controller-Designmuster in meiner PHP-Website / Web-App?

Ich verstehe nicht, wie ein Controller mit PHP nützlich sein könnte, da jede PHP-Seite bei jeder Anfrage dynamisch generiert wird. Nachdem eine Seite von PHP generiert wurde, gibt es keine Möglichkeit, die Ansicht (die generierte HTML-Seite im Browser) mit dem Controller interagieren zu lassen, da der Controller auf der Serverseite ist und bei jeder Seitenanfrage einmal generiert wird, auch wenn die Anfrage AJAX ist...

Verstehe ich etwas komplett falsch?

Warum sollte ich überhaupt ein MVC PHP-Framework wie Zend oder Symphony verwenden?

BEARBEITEN: Zum Beispiel nehmen wir an, es sollte eine Website geben, die eine Liste von Kunden in einer Tabelle darstellt:

Mein Model wäre eine einfache Klasse Customer auf der Serverseite, die die Datenbank abfragt. Meine Ansicht wäre der generierte HTML-Code, der das Model anzeigt (Liste der Kunden). Und der Controller? Bewertet der Controller nur das GET oder POST, um die richtige Methode des Modells aufzurufen?

2 Stimmen

Es heißt Model View Controller (MVC). Das bedeutet, dass du einen Controller brauchst.

1 Stimmen

@sockeqwe, hast du die "richtige Antwort" aufgrund der Länge gewählt? Denn die aktuelle Antwort (von Scott Bailey) ist völlig falsch und völlig daneben.

0 Stimmen

@tereško, was würden Sie in Scotts Antwort ändern, entfernen oder hinzufügen?

5voto

Darin Dimitrov Punkte 990883

Habe ich etwas völlig falsch verstanden?

Ja.

Das MVC-Muster ist nicht für den Browser. Der Browser sieht sowieso immer HTML. Ob dieses HTML mit C++, PHP, Java oder was auch immer generiert wird, ist egal. Der Browser interessiert sich nicht dafür, welche Designmuster verwendet wurden, um dieses HTML zu generieren.

MVC ist ein Designmuster zur Organisation und Trennung von Verantwortlichkeiten in Ihrem Code. Es ist also nicht für den Browser, sondern für die Entwickler, die den Code schreiben. Es dient dazu, wartbaren Code zu erstellen, bei dem eine klare Trennung zwischen Ihrer Geschäftslogik (Model), der Kommunikation zwischen dem Modell und der Ansicht (Controller) und der Benutzeroberfläche (View) besteht.

Ob Sie das MVC-Muster in Ihrer Webseite verwenden sollten, ist eine subjektive Frage, die ich lieber nicht beantworten möchte, da dies von vielen Faktoren abhängt.

2voto

Scott Bailey Punkte 353

Kurze Antwort

Ja. Ein Controller ist dafür verantwortlich, Daten für die Anzeige vorzubereiten und manchmal GET- und POST-Anfragen zu verarbeiten, die von Ihrem Client stammen. Die HTML-Erstellung sollte dem View überlassen werden.

Lange Antwort

MVC kann sehr hilfreich sein, um Anwendungen wartbar zu halten und Ihren Code übersichtlich zu gestalten. Das Muster hilft dabei, die Trennung der Anliegen Ihres Codes sicherzustellen und wird in den meisten Fällen verhindern, dass Ihr Anwendungslogik mit der HTML-Erstellung verflochten ist. Ein Beispiel für ein MVC-Setup unten (es gibt sicherlich viele Variationen davon, aber es gibt Ihnen eine Vorstellung):

Modell

Verantwortlich für das Abrufen von Daten aus der Datenbank und das Speichern von Änderungen auf Anfrage. Ein Beispiel könnte ein PHP-Objekt sein, das einen Benutzer mit Namen und E-Mail-Feldern darstellt.

Controller

Verantwortlich für das Massieren und Manipulieren von Daten und für die Vorbereitung der Anzeige. Die vorbereiteten Daten werden an einen View zur Anzeige übergeben, wobei der View nur die für die Darstellung benötigten Daten kennen muss. Zum Beispiel: Ein Controller kann eine Abfragezeichenfolge untersuchen, um festzustellen, welches Element abgerufen und zur Anzeige kombiniert werden soll, zusammen mit mehreren zusätzlichen Modellabfragen, um zusätzliche Daten zu erhalten.

Oft sind Controller auch dafür verantwortlich, mit GET- und POST-Anforderungen umzugehen, die von Ihrem HTML-Client stammen, und irgendeine Art von Manipulation an Ihrer Datenbank anzuwenden. Zum Beispiel - die Bearbeitung von Formularübermittlungen oder AJAX-Anfragen für zusätzliche Daten.

Ansicht

Die Ansicht ist dafür verantwortlich, tatsächlich das HTML für die Anzeige zu generieren. In PHP würde eine Ansicht oft eine Vorlagendatei mit minimalem Logik sein. Zum Beispiel könnte sie wissen, wie man über die vom Controller bereitgestellten Elemente iteriert oder einige grundlegende Bedingungen hat.

Anwendungs-MVC vs. PHP/Python/etc. MVC

Basierend auf Ihren anderen Kommentaren scheint es, dass Sie mit der Verwendung von MVC im Kontext einer Desktop- oder mobilen Anwendung vertraut sind.

Einer der Hauptunterschiede zwischen MVC in den beiden Fällen liegt in der Granularität, mit der der Controller die Ansicht manipuliert und auf Ereignisse reagiert.

Zum Beispiel kann der Controller in einer traditionellen Anwendung auf Klickereignisse von einer Schaltfläche hören und entsprechend reagieren.

Wenn Sie jedoch serverseitige HTML-Erstellung durchführen, ist Ihr Controller nur für einen kurzen Moment "aktiv", während er das HTML für den Versand über das Netzwerk vorbereitet. Dies bedeutet, dass er nur begrenzt die Ansicht für die Anzeige einrichten und vorbereiten kann.

Statt auf traditionelle Ereignisse aus der Benutzeroberfläche zu hören, kann er stattdessen auf zukünftige GET- und POST-Anfragen unterschiedlich reagieren. Zum Beispiel kann eine "Speichern"-Schaltfläche in einem Formular eine POST-Anfrage an Ihren Server auslösen (zum Beispiel yourpage.php?action=save&value=blah). Beim Bearbeiten dieser Anfrage kann Ihr Controller auf Ihre Modelle zugreifen und Änderungen anwenden, usw.

1voto

samazi Punkte 1131

Ich bin mir bewusst, dass ich eine sehr alte Frage beantworte, jedoch glaube ich nicht, dass eine andere Frage Ihr ursprüngliches Anliegen angemessen beantwortet hat, und hoffentlich wird dies etwas Nützliches für andere hinzufügen, die auf diese Frage stoßen könnten, während sie sich über MVC informieren.

Zunächst einmal möchte ich sagen, dass ich einen interessanten Artikel über die Verwirrung gelesen habe, die innerhalb der PHP-Community über MVC besteht, und es lohnt sich, ihn zu lesen, wenn Sie diese Art von Frage stellen.

Model-View-Verwirrung Teil 1: Die Ansicht erhält ihre eigenen Daten aus dem Modell

Zweitens glaube ich nicht, dass Sie etwas falsch verstanden haben, sondern ein besseres Verständnis von PHP und MVC haben, das es Ihnen ermöglicht, die Frage zu stellen. Nur weil etwas von der Gemeinschaft definiert und akzeptiert wurde, bedeutet das nicht, dass Sie die Verwendung nicht von Zeit zu Zeit in Frage stellen sollten. Und hier ist der Grund.

Es gibt KEIN Gedächtnis zwischen Anfragen (außer für die SESSION-Sitzung) innerhalb einer PHP-Anwendung. Jedes Mal, wenn eine Anfrage empfangen wird, startet die gesamte Anwendung, bearbeitet die Anfrage und wird dann wieder heruntergefahren, d. h. es gibt keine im Hintergrund laufenden Anwendungsthreads (zumindest keine, die Sie in Ihrer Anwendung verwenden können), in denen Sie theoretisch den Anwendungsstatus beibehalten könnten. Das ist weder gut noch schlecht, es ist einfach so.

Wenn Sie das verstehen, können Sie wahrscheinlich erkennen, dass Ihre Gedanken korrekt sind. Warum würde eine Ansicht (die berechtigt ist, ihre eigenen Daten aus dem Modell abzurufen) einen Controller benötigen? Die einfache Antwort ist, dass sie das nicht muss. Für die reine Anzeige eines Modells ist es völlig legitim, dass die Ansicht ihre eigenen Daten abruft (über das Modell), und tatsächlich ist dies der richtige Weg zur Implementierung von MVC.

Aber Moment mal. Bedeutet das, dass wir keine Controller benötigen? Absolut NICHT! Was wir tun müssen, ist einen Controller für seinen angemessenen Zweck zu verwenden. Im MVC ist der Controller dafür verantwortlich, Benutzeranfragen zu interpretieren und das Modell zu bitten, sich zu ändern, um der Benutzeranfrage gerecht zu werden, danach kann das Modell seine Abhängigkeiten über die Änderung informieren und die Ansicht kann sich aktualisieren. Offensichtlich, wie Sie wissen, sitzt die Ansicht in einem PHP-Webanwendungs-Kontext nicht nur da und wartet auf Aktualisierungsmeldungen. Wie können Sie also die Benachrichtigung erreichen?

Hier glaube ich, wurde MVC gekapert. Um der Ansicht mitzuteilen, dass sich ihr Modell geändert hat, können wir sie einfach zur URL der Ansicht leiten, die auf das aktualisierte Modell zugreift. Großartig, aber jetzt haben wir etwas in den Controller eingeführt. Etwas, das sagt: "Hey, ich bin ein Controller, aber jetzt kenne ich den Standort der Ansicht." Ich denke, zu diesem Zeitpunkt dachte jemand: "Warum sollte ich den Benutzer umleiten? Ich habe alle Daten, die die Ansicht benötigt, warum sollte ich die Daten nicht einfach direkt an die Ansicht senden?" und zack! Hier sind wir.

Lassen Sie uns also zusammenfassen.

  1. Eine Ansicht kann im Rahmen von MVC direkt auf das Modell zugreifen
  2. Das Modell enthält die Geschäftslogik für die Domänenobjekte
  3. Ein Controller soll der Ansicht keinen Zugriff auf das Modell gewähren oder als eine Art Vermittler fungieren
  4. Der Controller akzeptiert Benutzeranfragen und ändert sein Modell
  5. Eine Ansicht ist nicht die Benutzeroberfläche/HTML, dafür wird eine Vorlage verwendet

Ein praktisches Beispiel Um zu erklären, was ich beschrieben habe, werden wir uns eine einfache, häufig vorkommende Funktion auf den meisten Websites heute ansehen. Das Anzeigen der Informationen eines einzelnen angemeldeten Benutzers. Wir lassen viele Dinge aus unserem Code hier aus, um nur die Struktur des MVC-Ansatzes zu demonstrieren.

Angenommen, wir haben ein System, bei dem eine GET-Anfrage für /user/51 auf unsere UserView mit den entsprechenden Abhängigkeiten gemappt wird.

Definieren wir also unsere Klassen.

// UserModel.php
class UserModel {
    private $db;

    public function __construct(DB $db) {
        $this->db = $db;
    }

    public function findById($id) {
        return $this->db->findById("user", $id);
    }
}

// UserView.php
class UserView {
    private $model;
    private $template;
    private $userId;

    public function __construct(UserModel $model, Template $template) {
        $this->model = $model;
        $this->template = $template;
    }

    public function setUserId($userId) {
        $this->userId = $userId;
    }

    public function render() {
        $this->template->provide("user", $this->model->findById($this->userId));
        return $this->template->render();
    }
}

Und das ist es! Sie benötigen den Controller überhaupt nicht. Wenn Sie jedoch Änderungen am Modell vornehmen müssen, würden Sie dies über einen Controller tun. Das ist MVC.

Haftungsausschluss

Ich befürworte nicht, dass dieser Ansatz korrekt ist, und jeder Ansatz, den ein Entwickler zu einem bestimmten Zeitpunkt verfolgt, ist falsch. Ich glaube fest daran, dass die Architektur eines Systems seinen Bedürfnissen entsprechen sollte und nicht einem bestimmten Stil oder Ansatz, wenn es notwendig ist. Alles, was ich zu erklären versuche, ist, dass innerhalb von MVC eine Ansicht tatsächlich berechtigt ist, direkt auf ihre eigenen Daten zuzugreifen, und der Zweck eines Controllers besteht nicht darin, zwischen Ansicht und Modell zu vermitteln, sondern er soll Benutzeranfragen akzeptieren, die eine Manipulation eines bestimmten Modells erfordern, und das Modell auffordern, solche Operationen durchzuführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X