2017-01-28 30 views
0

Hier ist etwas, was ich nicht verstehe. Ich habe ein ziemlich cooles Router- und MCV-System basierend auf einem Video-Tutorial erstellt und es funktioniert super! Es gibt eine Sache, über die ich etwas verwirrt bin. Es ist nichts Spezifisches für den Code, sondern mehr über die Logik. In Kürze:Verweis auf ein vorhandenes Objekt in PHP ... Vielleicht?

  1. Die Steuerung von der URL wird
  2. bekommt
  3. der Router die Controller-Klasse Versendungen und instanziiert es
  4. Die Controller-Klasse, die eine Basis Controller instanziiert wird erweitert und wird die entsprechende Modellklasse verwenden

Diese Modellklasse ist statisch und wird nicht instanziiert. Also, sagen wir, ich möchte ein neues Mitglied erstellen. Aus dem Innern der Controller-Klasse habe ich so etwas wie:

Model::createMember($this->first_name, $this->last_name, $this->screen_name, $this->created_date); 

Dann natürlich im Modell hätte ich eine Methode, die das Mitglied in der zugrunde liegenden Datenbank, die etwas aussieht schafft:

public function createMember($first_name, $last_name, $screen_name, $created_date) { blah blah blah } 

Das ist alles in Ordnung und Dandy, aber es scheint mir, ich sollte in der Lage sein, direkt auf die Eigenschaften des Controller-Objekts aus dem Modell zugreifen und vermeiden, all diese Argumente übergeben zu müssen. Der Zugriff auf Eigenschaften eines Objekts scheint für mich mehr OOP zu sein, also würde ich das gerne tun.

Das Problem ist, kann ich eine Klasse

$controller_object = new Controller(); 

aus dem Modell nicht tun, um die Steuerung zu verweisen und den Zugriff auf seine Eigenschaften zu erhalten.

Das Controller-Objekt existiert bereits vom Router, daher ist es nicht gut, ein neues zu erstellen. Ich muss in der Lage sein, eine Variable zu erstellen, die auf das vorhandene Objekt verweist.

Im Moment habe ich es funktioniert, aber ich habe im Grunde die Eigenschaften des Controller-Objekts global dann direkt von der Modellklasse mit dem globalen Schlüsselwort zugreifen können, aber ich will es nicht wirklich so machen.

Also ist meine Idee, das System nur schlecht zu verbessern, oder gibt es eine Möglichkeit, das vorhandene Controller-Objekt zu referenzieren, sodass ich direkt auf die öffentlichen Eigenschaften zugreifen kann, ohne Argumente vom Controller an das Modell übergeben zu müssen?

+4

Ein Modell ist nur ein Modell, sollte es keine Kenntnis von dem Controller oder Anwendungslogik hat. Wenn Sie dies tun, verschwindet die MVC-Trennung und Ihr Modell wird mit dem Controller gekoppelt und davon abhängig. Der Controller sollte Eingaben machen und das Modell damit füllen. – drew010

+0

Und warum Controller-Eigenschaften von Model zugreifen? –

+0

Nun, das Modell ist spezifisch für den Controller. Wenn ich einen MemberController habe, dann habe ich auch ein MemberModel. Also, sie sind verwandt. Das MemberModel ist im Grunde genommen die CRUD-Funktionalität, die für den MemberController spezifisch ist, es ist nicht nur ein generisches Modell und es ist spezifisch für den Controller, der es verwenden wird. – keithmj

Antwort

0

Die direkte Antwort auf Ihre Frage ist $this zu verwenden, da es tatsächlich die instanziiert Controller darstellt, wenn Sie in der Controller-Methode sind, so dass anstelle von

Model::createMember($this->first_name, $this->last_name, $this->screen_name, $this->created_date); 

Sie das nur tun können,

Model::createMember($this); 

Und dann können Sie innerhalb des Modells auf das Controller-Objekt zugreifen.

Praktisch würde ich das nicht tun, da das Modell eigentlich nicht vom Controller abhängen sollte.

Steuerungsverantwortlichkeit besteht darin, die eingehenden Anforderungsdaten zu analysieren, das Modell zu erstellen und die Anforderungsdaten an das Modell zu übergeben.

Es gibt keine Notwendigkeit in first_name, last_name, usw. Eigenschaften in der Steuerung. Der Controller kann nur einige $data Arrays mit den eingehenden Daten haben, es sollte sich nicht um den tatsächlichen Inhalt dieser Daten kümmern.

Modellverantwortlichkeit besteht darin, Daten zu validieren (dies kann auch ein separates Objekt sein) und die Datenbankoperationen oder andere Geschäftslogikoperationen in Bezug auf die Daten auszuführen.

Ich würde auch vermeiden, die statischen Methoden für das Modell zu haben. Statt

Model::createMember(...parameters...) 

ich tun würde,

// $data is the request data parsed by controller 
// controller knows how/where to get the data (from GET, POST, etc) 
// but it doesn't care about the actual content 
$model = Model($data) 
... 
if ($model->validate()) { 
    $model->save() 
    // show success message to the user 
} else { 
    // show error message to the user 
} 
+0

Ich sehe was du sagst. Vielleicht legt mein System dem Controller etwas mehr Gewicht bei. Ich stimme zu, dass alle Datenbankfunktionen im Modell ausgeführt werden. Das Steuerelement muss jedoch wissen, welche Daten es an das Modell weitergibt, falls es Daten manipulieren muss, bevor es an es übergeben wird oder wenn es auf die Ansicht reagiert. In meinem Fall mache ich keine serverseitigen Formvalidierungen. All das geschieht im Client. Das Modell sucht natürlich nach vorhandenen E-Mail-Adressen und übereinstimmenden Anmeldeinformationen, aber keine Formularvalidierungen. – keithmj

+1

Oh, aber trotzdem, ich habe einiges geändert, basierend auf Kommentaren, und ich habe alle globalen Variablen losgeworden. – keithmj

Verwandte Themen