3 Stimmen

Wie übergeben Sie Werte zwischen PHP-Seiten für MVC?

Wie geben PHP-Programme Werte zwischen Modell-, Ansichts- und Controller-Seiten weiter? Zum Beispiel, wenn ein Controller ein Array hatte, wie gibt er das an die Ansicht weiter?

BEARBEITEN:

Vielen Dank für eure Antworten. Ich sehe ein paar von ihnen erklären, dass die Komponenten auf derselben Seite sind, aber wenn ich mir etwas wie CodeIgniter anschaue, sehe ich drei separate PHP-Seiten für Modell, Ansicht und Controller.

6voto

cdnicoll Punkte 584

Normalerweise erstellt Ihr Controller ein Ansichtsobjekt, und wenn es dieses Ansichtsobjekt erstellt, übergibt es die Informationen.

content = $content;
        include_once('myPage.inc.html');
    }
}

?>

0 Stimmen

Wenn Sie "include_once" oben und dann das PHP oben ausführen, ist es richtig, dass die .html-Datei auf der aktuellen PHP-Seite oben eingeschlossen wird? Warum nicht einfach alles auf einer Seite haben?

0 Stimmen

PHP ist nicht wie c++ oder c#, weil du keine namespaces einschließt oder verwendest (PHP 5.3 hat tatsächlich namespaces). Wenn du include_once() verwendest, fügst du tatsächlich dieses Skript der Seite an. Der Hauptgrund, warum du deine Skripts aufteilst, ist für die Programmlogik.

2voto

villecoder Punkte 12984

CodeIgniter, wie die meisten PHP MVC-Frameworks, kommt mit einem View-"Motor". Mit anderen Worten, es gibt eine Klasse im Framework, die für das Laden und Übertragen von Daten von Ihrem Controller zum View verantwortlich ist.

Spezifisch für CodeIgniter sehen diese Aufrufe so aus:

$data = array(
           'title' => 'Mein Titel',
           'heading' => 'Meine Überschrift',
           'message' => 'Meine Nachricht'
      );

$this->load->view('blogview', $data);

Ihr View wäre dann eine separate PHP-Seite, in diesem Fall blogview.php. Es könnte so aussehen:

   <?= $title ?>

Der Teil, der für die Übertragung der Daten zwischen dem Controller und dem View verantwortlich ist, ist der View-Motor (oder die Klasse) intern zu CodeIgniter. Er nimmt das Array vom Controller und deserialisiert es für den View.

Warum also zwei separate Dateien? Das MVC-Paradigma ist so gestaltet, dass Sie Ihre Business-Logik von Ihrem UI getrennt halten möchten. Wenn Sie nicht viel mit einer Datenbank machen, müssen Sie den Model-Teil von MVC nicht einbeziehen. Aber er ist da, wenn Sie die Datenzugriffsteile Ihres Codes weiter von Ihrer Business-Logik trennen möchten (die Sachen, die die Daten für den Benutzer manipulieren). In diesem Fall haben Sie Ihre 3 separaten Dateien; Model, Controller, View.

Also nein, die Komponenten sind nicht alle auf derselben Seite, obwohl sie es sicherlich sein könnten. Aber wenn Sie Ihr Programm mit MVC strukturieren, trennen Sie die Operationen Ihrer Anwendung sauber und ordentlich. Auf diese Weise können Sie in einer Schicht arbeiten, ohne die anderen Schichten zu beeinflussen. Ihr CSS-Berater könnte die Website schön aussehen lassen, während Sie herausfinden, warum der Benutzer sich nicht einloggen kann, zum Beispiel.

0 Stimmen

"Der Teil, der für die Übertragung der Daten zwischen dem Controller und der Ansicht verantwortlich ist, ist der interne View-Engine (oder die Klasse) von CodeIgniter. Es nimmt dieses Array vom Controller und deserialisiert es für die Ansicht." Aber wie macht es das? Wie würde ich das Gleiche auf sehr grundlegende Weise von Grund auf tun?

0 Stimmen

Nutzen Sie die php Funktion extrahieren. Das wird die Schlüssel des Arrays in individuelle Variablen umwandeln. Siehe php.net/manual/de/function.extract.php.

1voto

Geoff Kendall Punkte 1093

Ich hoffe, Johnny hat längst die Antwort gefunden, nach der ich jetzt suche, aber ich kann einen Einblick darüber liefern, wie man es unbefriedigend machen kann! Sie können von einem Information aus einer Datei (sagen wir, einem 'view'-Komponenten, die Benutzereingaben sammelt) zu einer anderen Datei (sagen wir, einem 'model'-Komponenten, der die Formulardaten überprüft/validiert und sie entweder zur Überarbeitung an das Formular zurücksendet oder sie in einer Datenbank speichert) übergeben. Formularwerte können über die POST- oder GET-Arrays gesendet werden und das 'action'-Attribut bestimmt, welche Datei die Daten erhält, z.B.

---Hier werden einige mögliche Benutzereingaben eingegeben

Nach der Verarbeitung möchten Sie möglicherweise einige Daten an das Formular zurückgeben - wie z.B. die Benutzereingaben, die geändert werden müssen, oder eine Erfolgsmeldung. Sie können diese Daten in Sitzungsvariablen speichern und sie auf der 'view'-Seite aus diesen Variablen wiederherstellen. Also, wie gelangen Sie zurück zur 'view'-Seite? Nun, ich bin hier, weil ich dies gesehen habe und es selbst benutzt habe, war aber ziemlich entsetzt zu lesen, dass anscheinend der Transfer über eine langsame Internet-HTTP-Anfrage erfolgt - selbst wenn der Transfer zu einer Datei im selben Verzeichnis auf dem Server erfolgt! Okay, der UNZUFRIEDENSTELLENDE Weg, um zu Ihrer 'view'-Komponente zurückzukehren, ist ein paar PHP-Zeilen wie diese:

header("location: theinputform.php");
    exit;

Es funktioniert, aber es muss doch einen besseren Weg geben, oder? Ich habe einen 'Rant' von jemandem gesehen, der sagt, dass man einfach ein include verwenden sollte, aber ich verstehe nicht, wie man die relativ alltägliche Sache erledigt, wieder zum Anfang einer Seite zurückzukehren und sie entsprechend den neuen Bedingungen neu zu erstellen. Wenn ich z.B. gerade einen Benutzer angemeldet habe, möchte ich bei diesem Versuch keine Aufforderung zur Anmeldung anzeigen. Includes sind die naheliegende Option, um bedingt etwas zu einer Seite HINZUZUFÜGEN, aber ich habe keinen besseren Weg gefunden, um einfach zum Anfang zurückzukehren als oben beschrieben. Hat jemand einen Einblick oder Wissen darüber? Wie der OP sagt, wollen Johnny und ich das Gleiche wie ein MVC machen, verwenden aber kein MVC-Framework. Es gibt übrigens mehrere Bücher und Tutorials, die einfach die obige 'header'-Methode verwenden.

Okay, Bearbeitung: Sie gelangen von einem Formular (d.h. einer 'view'-Seite) zur Formularverarbeitung über das 'action'-Attribut des Formulars, wie oben beschrieben. Wenn die 'model'-Seite kein HTML ausgibt und einfach 'Dinge tut', können Sie einfach die 'view'-Seite einfügen, zu der Sie nach Abschluss gehen möchten (oder zurückkehren möchten). Ich denke zumindest so! Ich werde das gleich ausprobieren...

1voto

m_eric Punkte 1056

Ich habe selbst mit dieser Frage gekämpft. Ich war nach fast einem Jahrzehnt zum PHP-Programmieren zurückgekehrt. Ich stieß auf ein paar Probleme beim Bereitstellen von PHP MVC-Frameworks auf einem Experimentalsystem, sodass ich schließlich eine einfache MVC-Variante selbst erstellte.

In meinem einfachen Design interagiert der (Frontend-)Controller mit dem Modell, um ein Nutzlastobjekt zu erstellen und übergibt es an die Ansicht. Jede Ansicht ist in einer separaten PHP-Datei implementiert, sodass der Controller include verwendet, um die gewünschte Ansicht "zu laden". Die Ansicht kann dann über den festgelegten Namen ($dataId) auf die Daten im Nutzlastobjekt zugreifen.

class Controller {
        public $model;
        ...
        public function display($viewId,$dataId,$data)
        {
          $url = $this->getViewURL($viewId);
          $this->loadView($url,$dataId,$data);              
        }

        public function getViewURL($key)
        {
            $url = 'view/list_view.php';

            if($key == 'create')
            {
                $url = 'view/create_view.php';
            }
            else if($key == 'delete')
            {
                $url = 'view/delete_view.php';
            }

            return $url;            
        }

        public function loadView($url,$variable_name, $data)
        {
            $$variable_name = $data;
            include $url;
        }
}

0 Stimmen

Danke. Ich habe auch selbst angefangen. Zu viel Magie in allem anderen.

0voto

Your Common Sense Punkte 154708

Model, Ansicht und Controller sind keine separaten Seiten, sondern eine Seite.
Also, es ist nicht nötig, etwas "weiterzugeben"

1 Stimmen

Warum erscheinen sie als separate Seiten? Zum Beispiel hat CodeIgniter, zumindest für mich, offensichtlich drei PHP-Seiten.

0 Stimmen

Aus demselben Grund, aus dem Sie jedes Programm in mehrere Dateien aufteilen. Es dient der Organisation.

0 Stimmen

@simuri Ich sage, dass der Col. gesagt hat, dass es sich nicht um separate Seiten handelt, und ich sage, dass es das sind, weil ich drei separate Seiten sehen und tatsächlich drei Seiten bearbeiten kann. Ich bin mir nicht sicher, ob du verstanden hast, was ich meine.

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