Ich schreibe eine Anwendung neu, die zuvor im CodeIgniter-Framework geschrieben wurde, mein Kunde möchte eine unabhängige App und einen reinen PHP-Code haben. Wie auch immer, erzähl mir nicht das Rad nicht neu zu erfinden weil ich bereits weiß, dass mein Klient falsch liegt. Wir kommen zu dem Problem.
Ich bin auf der Suche nach einer einfachen Route-Klasse, mit der ich beliebige Dateien von jedem beliebigen Ort aufrufen kann. Ich fand diese einfache und mächtige Klasse, das ist das Repository .
Ich habe es in meinem Projekt implementiert, kopiere die Datei route.php
in den Index und ändere mein .htaccess
, wie es in der Dokumentation steht. Stattdessen ist dies die Struktur meines Projekts:
Wenn die Anwendung von index.php
gestartet wird, ist die Konfigurationsdatei für die Verbindung mit der Datenbank enthalten. In derselben configuration
Datei habe ich route.php
importiert. Jetzt ist meine index.php
Seite sehr einfach, so:
Wenn also session
gesetzt ist, leite ich den Benutzertyp an den richtigen Ort um, wenn nicht, zeige ich die Anmeldeseite an. Die Seite login
valorisiert einfach die Sitzungsvariable. Wenn die Antwort erfolgreich ist, wird der Benutzer erneut auf die Indexseite umgeleitet.
Das Problem ist jetzt, dass zum Beispiel, wenn der Admin protokolliert wird (also case 1
), die route
Klasse das $uri
nicht aufwertet, ein kleines Beispiel:
überprüfen Sie die vollständige Klasse hier .
Die Variable $uri
sollte mit der aktuellen uri
des Servers valorisiert werden, aber ich habe versucht mit einem var_dump und ich bekomme einen leeren Wert. Dann wird die Übereinstimmung Bedingung nie aufgerufen, und die richtige Datei wird nicht angezeigt. Ich weiß nicht warum, ich will nur verstehen, warum es nicht funktioniert, ich mache wahrscheinlich etwas falsches, jemand kann mir helfen zu verstehen?
Um das Beispiel der Admin-Weiterleitung zu vervollständigen, möchte ich nur zeigen, was in backend.php
enthalten ist, welches von route
geladen werden sollte.
Wie Sie sehen können, möchte ich einfach die Funktion index
des Controllers backend
aufrufen, wenn ich ->add()
aufruft, um die URL des Controllers zum Aufruf hinzuzufügen, und ->submit()
, um die Operation auszuführen.
Was mache ich falsch?
UPDATE - Routeranforderungsaufgabe
Zuerst habe ich den Stapel meiner Anwendung aktualisiert. Ich denke an dieser Stelle ist es am besten, Ihren Expertenrat zu fragen, welcher OpenSource Router mir erlaubt, diese Aufgaben zu implementieren:
1. Controller importieren
Importieren Sie alle Controller, die in meinem Ordner namens controllers
enthalten sind. Sobald Sie importiert haben, werde ich einfach die Instanz des Routers aufrufen und eine bestimmte Funktion des geladenen Controllers aufrufen. Beispiel:
wo index();
Es repräsentiert die Funktion des Controllers namens backend
.
Dies muss in meiner gesamten Anwendung erfolgen. Auch würde ich sicherstellen, dass wir die Funktion auch über die URL aufrufen können, insbesondere wenn ich diese URL einfüge:
Ich kann dieselbe Funktion aufrufen, indem ich einfach url verweise.
2. Anfragen ajax Lieferung Mein Router muss in der Lage sein, AJAX-Anfragen von Javascript auszuführen, besonders wenn ich diesen Code verwende:
%Vor% Ich möchte die Benutzerfunktion ajax_check_login
aufrufen.
enthalten in der Steuerung user
, imagine GlobalVariables.baseUrl
, was ist ... Wie können wir denken, ist die URL der Basisanwendung, die offensichtlich variieren kann.
Beachten Sie, dass meine Controller-Funktion ein JSON-Format zurückgibt.
3. Ansicht laden
in meiner Anwendung gibt es die Ansicht, die in .php
gespeichert sind, aber mit HTML-Datei, ein Beispiel für die Ansicht (zuvor in CodeIgniter geschrieben) pul finden Sie hier .
Ich möchte eine Ansicht aufrufen und den neuen HTML-Markup des Benutzers anzeigen können. Ich muss im gleichen Moment auch mehr Ansichten aufrufen, zum Beispiel teile ich den Körper manchmal in:
Um das Verständnis zu erleichtern, auf was $this
in einer Ansicht verweist, da eine Ansicht von einer Controller-Methode "geladen" wird, wird die Ansicht immer noch im selben Bereich wie diese Methode ausgeführt, dh $this
kann a haben je nachdem, welche Klasse sie geladen hat.
Zum Beispiel:
%Vor% In jeder View-Datei, die in diesem Beispiel-Controller geladen wird, bezieht sich $this
speziell auf die Klasse Controller1, die auf CI_Controller
public und geschützte Eigenschaften / Methoden zugreifen kann (wie die Loader- oder Input-Klassen, die der Laden und Eingabe von Eigenschaften von CI_Controller), da diese Klasse erweitert.
Controller sind immer noch einfach nur alte PHP-Klassen. Wenn ich das tun würde:
%Vor%... Wenn wir dieselbe Ansichtsdatei in einer beliebigen Methode eines dieser Controller laden, gibt% ce_de% in dieser View-Datei einen anderen Wert zurück. Aber das ist im Moment nicht wichtig, ich möchte einfach so klar wie möglich sein. Ich beginne einen Bount und verliere meinen ganzen Ruf, aber ich möchte wirklich Hilfe dabei bekommen und lernen.
Sie müssen sich die am Router zur Verfügung gestellte index.php als Beispiel ansehen. Sie werden sehen, wie Sie die Routen einstellen:
'index'
sein, sondern ein Funktionskörper function(){...}
. Vielleicht würde Referenz auch funktionieren. $router->backend->index();
, ich habe einen gemeinsamen Code am Ende der Datei, damit Sie den Code nicht mehrmals kopieren und einfügen müssen. Ich zeige Ihnen das Backend auf Ihre Art und dann mit den Terminen, wie Sie es allgemein machen könnten. Also solltest du deine Routen so gestalten:
%Vor%controllers / view.php:
%Vor%Beispiel einer json Antwort in controllers / user.php:
%Vor%