Die Routenklasse funktioniert nicht ordnungsgemäß

8

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:

%Vor%

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:

%Vor%

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:

%Vor%

ü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.

%Vor%

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:

%Vor%

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:

%Vor%

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:

%Vor%

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.

    
Dillinger 31.01.2016, 09:58
quelle

1 Antwort

3

Sie müssen sich die am Router zur Verfügung gestellte index.php als Beispiel ansehen. Sie werden sehen, wie Sie die Routen einstellen:

  • Sie müssen immer zwei Argumente haben: 1. uri, 2. function
  • Gemäß dem Beispiel muss die Funktion nicht der Funktionsname 'index' sein, sondern ein Funktionskörper function(){...} . Vielleicht würde Referenz auch funktionieren.
  • Routing IMHO sollte nicht von der Sitzung abhängig sein (obwohl es sein könnte, aber das ist nicht der übliche Weg)
  • anstelle von $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%     
Gavriel 02.02.2016, 10:45
quelle

Tags und Links