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.
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
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
Ich verstehe dich nicht. – Allenph