Routing ein echtes Problem ist, und ich kann in einem Kommentar nicht erschöpfend sein, aber ich werde versuchen, mein Bestes zu tun. Bitte vergib mir mein ungefähres Englisch und lass es mich wissen, wenn du es nicht verstehst. Ich muss noch viel lernen, also werde ich versuchen, es durch etwas zu erklären, das ich gemacht habe, aber es ist wahrscheinlich vollkommen verbesserungsfähig.
Heutige PHP-Standard-Empfehlung über Routing und Dolmetschen Anfrage sollte implementieren PSR7.
Ich persönlich benutze es durch eine FrontController Design Pattern in einem MVC-Framework Ich baue diese Konzepte zu verstehen. Meine Ordner sind wie folgt organisiert:
öffentlich:
Wo ich meinen Web-Server zu starten, in dem Sie Javascript/CSS finden. Es gibt eine index.php, die nur enthält
require_once ('../ index.php');
App: Wo es der Router ist und meist alle generischen Code
Src: Wo es an die App die spezifischen Code. Das bedeutet Controller und Entitäten für jetzt.
Hersteller: Composer Abhängigkeiten wie GuzzleHTTP, um eine Klasse zwischen der tatsächlichen Anfrage und dem Code zu haben.
Hier ist der Code in index.php mein root:
<?php
require_once 'vendor/autoload.php';
use Namespace\FrontController;
use \GuzzleHttp\Psr7\ServerRequest;
use function Http\Response\send;
$front_ctrl = new FrontController(ServerRequest::fromGlobals());
send($front_ctrl->getResponse());
Der wichtigste Punkt ist, dass ich die Anfrage innerhalb einer Instanz einer Klasse Umsetzung PSR7 interpretieren.
In meinem FrontController, meine Anfrage Reisen durch einige Methoden (wie Entfernen von abschließenden Schrägstrich), um nur gesendet in einer Router-Klasse behandelt werden.
Die purpouse meiner Router-Klasse ist zu prüfen, ob die URI im Array existiert, wo ich meine Routen alle in einer JSON-Datei unter diesem Format bestücken:
{
"/": [
"AppController",
"indexAction",
["GET", "POST"]
],...
}
Dies ist, wo ich Regex verwenden Variable Übereinstimmen in der URI (/ article /: id zum Beispiel) auch.
Diese Klasse kann wie folgt fortgesetzt werden: "Existiert diese URI in meiner App?".
An dieser Stelle instanziiere ich eine neue Route-Klasse mit dem gesamten Array als Parameter. Von hier aus muss ich Fragen beantworten wie "Ist es an eine Methode in einem Controller angeschlossen?", "Wird die Methode, in der es gefragt wird, behandelt?" ...
Zusammenfassend, an dieser Stelle habe ich eine Instanz einer Klasse, die die Anfrage darstellt, eine andere, die alle meine Routen darstellt. Ich konfrontiere sie, um ONE Route zu bekommen, die ich durch eine Instanz einer Klassenroute manipulieren werde.
Wenn es all diese Tests bestanden hat, dann kann ich den richtigen Controller instanziieren, wo es den spezifischen Teil der App gibt, der eine Aktion erfordert, um Daten zu erhalten, die ich in meinen Ansichten senden werde, um eine HTML-Ausgabe zu erzeugen die ich zurück zu meiner Funktion zurücksenden werde, so dass die Ausgabe angezeigt wird, wenn Sie nach einem bestimmten URI fragen.
Der Hauptpunkt dieser langen Antwort ist, Ihnen etwas zu zeigen, das fast vollständig unabhängig vom Server ist. Es ist auch nützlich, wenn Ihre App größer wird und spezifischere Regeln für das Routing berücksichtigt. Es zwingt Sie, alle Bündel Ihrer App zu trennen: Ein Controller ist kein Modell, kein Router ...
Versuchen Sie, einige gute Tutorials zu finden, um orientierte Objektorientierung in PHP zu lernen, die einfache Sicherheitsprobleme vermeiden und geben würde Sie viel mehr Komfort, wenn eine App developping :)
Hoffe, dass es verständlich und hilfreich war die Überprüfung
Nur ... hast du diesen [Beitrag] sehen (https://stackoverflow.com/a/27169174/6780663) ? –
hey @ AlejandroMontilla, ja ich habe das gesehen, aber da ich Laravel nicht benutze, konnte ich es nicht herausfinden :( – emma
Du solltest die Antwort von @Zyigh sehen, es ist eine wirklich gute Erklärung. –