2016-06-14 3 views
0

Ich aktualisiere ein PHP-Framework, das ich geschrieben habe. Früher verwendete es nur ein Standardverhalten für das Routing. Zum Beispiel ein Fall betrachtet, in dem der Antrag auf domain.com/package/controller/method geht ...Verwenden von `__destruct`, um Standard-Routing zu implementieren?

$url = ["package", "controller", "method"]; 
//Check if package exists... 
//Check if controller exists in package... 
//Check if method exists in controller... 

Das ist alles gut und gut, und funktioniert perfekt. Ich wollte jedoch meinem Router zusätzliche Funktionen hinzufügen. Diese Funktionalität ist die Fähigkeit, benutzerdefinierte Routen zu definieren und eine anonyme Funktion zu übergeben, die das tut, was Sie wollen.

Vorausgesetzt, dass die Anfrage keiner der benutzerdefinierten Routen entspricht, möchte ich die Standardfunktionalität verwenden, die ich jetzt habe, um zu prüfen, ob es weitere mögliche Routen gibt. Auf diese Weise kann ich alte Projekte mit dem neuen Framework aktualisieren und sie nicht unterbrechen, und zusätzlich ... Ich mag dieses Standardverhalten, weil die meisten Zeit Routen nicht so kompliziert sind und definierende Routen sich für mich wie eine Verletzung von DRY anfühlen.

Das Problem ist, dass ich nicht die benutzerdefinierten Routen als Array an den Objektkonstruktor übergeben möchte. Vielmehr möchte ich, dass der Benutzer sie als Methoden für das Basisanwendungsobjekt bezeichnet, ähnlich wie Laravel oder Express dies behandelt.

Das Problem ist, dass ich die Standardroute überprüfen möchte, nachdem die vom Benutzer definierten Routen nicht zuvor überprüft wurden. Dieser quasi-Code könnte helfen zu verstehen, was ich meine ...

class App 
{ 
    __construct 
    { 
    //Check Default Routing 
    } 
    private function get() 
    { 
    //Get Request 
    } 
    private function post() 
    { 
    //Post Request 
    } 
    private function put() 
    { 
    //Put Request 
    } 
    private function delete() 
    { 
    //Delete Request 
    } 
} 

app::get(); 

Im obigen Fall wird das Standard-Routing stattfinden würde, bevor die benutzerdefinierten Routen genannt werden. Ich schaute at the PHP consrtuctor/destructor page und lernte über __destruct. Aber nach dem Lesen von this question bin ich ein wenig unsicher, dass das funktionieren würde.

PHP.net sagt ...

Die Destruktormethode wird so schnell aufgerufen werden, da es keine andere Referenzen auf ein bestimmtes Objekt oder in beliebiger Reihenfolge beim Herunterfahren Sequenz.

Der erste Teil dieser Erklärung klingt genau wie ich will. I.E. Sobald alle Methoden für das Anwendungsobjekt aufgerufen wurden, führen wir die Funktion __destruct aus, die überprüft, ob die benutzerdefinierten Routen erfolgreich waren. Falls nicht, überprüfen Sie, ob das Standard-Routing-System Ergebnisse liefert.

Das Problem ist, dass ich nicht sicher bin, ob das eine schlechte Praxis ist, oder einfach nicht funktionieren wird. Kann ich eine Datei benötigen, meinen Controller einstellen und dann eine Methode auf diesem Controller aus der __destruct aufrufen? Gibt es Einschränkungen, die den Code innerhalb dieser Controller beeinflussen würden? Angenommen, dass ein Problem besteht __destruct auf diese Weise verwenden, was meine Alternativen sind, wenn man bedenkt, am Ende ich mag keine dieser Lösungen ...

  • Nachdem der Benutzer die Standard-Routing als Methode aufrufen von ihrem Skript.
  • Übergeben von Routen als Arrays an den Konstruktor.

Antwort

0

Ich denke, du bist hier verwirrt.Notieren Sie dies aus dem PHP-Handbuch

Die Destruktor-Methode wird aufgerufen, sobald keine weiteren Verweise auf ein bestimmtes Objekt oder in irgendeiner Reihenfolge während der Abschaltsequenz vorliegen.

dies eine andere Art und Weise zu setzen, gibt es zwei Gründe, eine destructor zu nennen

  1. Die Klasse Müll gesammelt werden. Mit anderen Worten, Sie haben alle Referenzen auf die Klasseninstanz überschrieben oder unset. Das heißt, Sie können diese Klasse nicht mehr direkt aufrufen
  2. Das PHP-Skript hat sein Ende erreicht und der Thread wird heruntergefahren.

Mit anderen Worten, es ist nichts mehr für die Klasse zu tun. Aber in Ihrer eigenen Aussage sagen Sie das

Der erste Teil dieser Erklärung klingt genau wie ich will. I.E. Sobald alle Methoden für das Anwendungsobjekt aufgerufen wurden, führen wir die __destruct-Funktion aus, die prüft, ob die benutzerdefinierten Routen erfolgreich waren, und falls nicht, überprüfen Sie, ob das Standard-Routing-System Ergebnisse liefert.

Es gibt keine "und" hier zu arbeiten. Das ist der Punkt. In der Tat, there's very few places you would use this.

Was Sie brauchen, ist in Schichten zu denken. Sie hätten also eine Controller-Schicht, die Sie aufrufen würden, um die Methoden zu überprüfen. Dieser Controller öffnet wiederum eine neue Ebene, die Benutzerfunktionen überprüft. Diese Klasse oder Methode sollte etwas zurückgeben oder ein Exception werfen, wenn es fehlschlägt. Bei einem Fehler kann dann versucht werden, Standardmethoden zu verwenden. So müssen Sie Ihr Programm strukturieren. Der Versuch, einen Destruktor zu verwenden, würde wahrscheinlich nur Menschen verwirren. Machen Sie den Datenfluss explizit, nicht implizit (was magische Methoden tun).

+0

Ich bin ein wenig verwirrt darüber, wie man das implementieren würde. Die einzige Möglichkeit, die mir einfällt, wäre, die Anwendung zu einer Eigenschaft eines größeren Objekts zu machen, was für mich keinen Sinn ergibt. Sollten Objekte nicht eigenständige Funktionen sein? Könnten Sie vielleicht eine Art Quasi-Code bereitstellen? Wenn Sie nicht vorschlagen, das Objekt als eine Eigenschaft eines größeren Objekts hinzuzufügen, scheint es, als ob Sie die Antwort sind, führt mich zurück zu meiner Frage. "Wie rufe ich eine Methode auf, nachdem alle anderen Methoden, die das Objekt betreffen, ausgewertet wurden?" – Allenph

+0

Dann sollte Ihr Programm das als logischen Schritt haben. Sonst wirst du Objekte setzen/unscharf stellen, nur um herauszufinden, ob sie tun was du willst. – Machavity

+0

Ich verstehe dich nicht. – Allenph

Verwandte Themen