Heim  >  Artikel  >  Backend-Entwicklung  >  Bitte geben Sie mir einige Ratschläge zum Implementierungsprinzip des PHP-Routings

Bitte geben Sie mir einige Ratschläge zum Implementierungsprinzip des PHP-Routings

WBOY
WBOYOriginal
2016-12-01 00:56:231685Durchsuche

Nachdem ich das Framework eine Weile verwendet hatte, wurde mir plötzlich klar, dass der Kern des MVC-Frameworks das Routing ist. Können Sie mich bitte über die spezifischen Prinzipien aufklären? TP5-Routing ist beispielsweise sehr leistungsfähig, aber der Quellcode Hat im Grunde keine Kommentare. Nachdem ich es zwei Stunden lang gelesen hatte, war ich fassungslos.

Alles, was ich jetzt tun kann, ist der Pfadinfo-Schritt. Ich kann die verschiedenen folgenden Regelroutings und regulären Routings nicht verstehen. Ich hoffe, Sie können mir einen Implementierungsprozess oder eine spezifische Demo oder ein Tutorial geben, die damit zusammenhängen können . Bücher sind ebenfalls erhältlich O(∩_∩)O Danke!

Antwortinhalt:

Nachdem ich das Framework eine Weile verwendet hatte, wurde mir plötzlich klar, dass der Kern des MVC-Frameworks das Routing ist. Können Sie mich bitte über die spezifischen Prinzipien aufklären? TP5-Routing ist beispielsweise sehr leistungsfähig, aber der Quellcode Hat im Grunde keine Kommentare. Nachdem ich es zwei Stunden lang gelesen hatte, war ich fassungslos.

Alles, was ich jetzt tun kann, ist der Pfadinfo-Schritt. Ich kann die verschiedenen Regel-Routing- und regulären Routing-Schritte nicht verstehen. Ich hoffe, Sie können mir einen Implementierungsprozess oder eine spezifische Demo oder ein Tutorial geben (∩_∩)O Danke!

Zusätzlich zum Lesen des Codes anderer Personen besteht eine bessere Möglichkeit darin, einen Debugger (z. B. xdebug) zu öffnen und ein einstufiges Debugging durchzuführen. Einerseits haben Sie Informationen vom Debugger und andererseits von Ihnen Haben Sie Ihren eigenen tatsächlichen Code, der ausgeführt werden kann? Die Anwendungsfälle (der Testcode, den Sie geschrieben haben) können für Sie einfacher zu verstehen sein

Zurück zum Thema Routing: Schließlich müssen Sie nur herausfinden, wie Sie Pfadinformationen aufteilen und analysieren. Die direkte Zuordnung von Pfadinformationen zu Namespaces oder die Zuordnung zu einem Controller über reguläre Ausdrücke sind nur eine der Analysemethoden.

Wenn Sie versuchen möchten, das Rad neu zu erfinden, können Sie versuchen, die einfachste Methode der direkten Zuordnung zu einer Klasse unter dem Namespace

zu implementieren

hello/world -> HelloController->world()

test/hello/world -> testHelloController->world()

Nachdem die Route analysiert wurde, wird sie verteilt. In diesem Bereich können Sie mehr über Reflexion, Abschluss und anderes damit verbundenes Wissen erfahren

Schließlich gibt es viele Komponenten, die nur den Router auf Github implementieren. Sie können sich auch dafür entscheiden, nur den Code dieser Komponenten zu lesen (zur tatsächlichen Verwendung können Sie ihn über Composer in Ihr Projekt einführen)

Zum Beispiel:

  • https://github.com/nikic/Fast...

  • https://github.com/dannyvanko...

  • https://github.com/mrjgreen/p...

Empfehlen Sie eine Routing-Implementierung für Sie

https://github.com/bephp/router

  1. Der Code ist sehr kurz, etwa 100 Zeilen

  2. Unterstützt get, post und andere Methoden zum Definieren von Routen, sofern diese aufrufbar sind.

  3. Zusätzlich zum Abgleich der Parameterbedeutungen in Pathinfo werden Parameter auch automatisch durch Reflektion ermittelt (diese Funktion ist nützlicher)

  4. Verwendung einer Baumstruktur zum Speichern von Routing-Mapping-Tabellen, die eine bessere Leistung als mehrere häufig verwendete Routen (mit Beachmark) bietet

  5. Unterstützt „Kompilierung“, was dem Caching von Routing-Tabellen entspricht, um eine schnellere Leistung zu erzielen

  6. Kann mit Composer installiert werden, keine Abhängigkeiten

Natürlich gibt es eine einfachere und direktere Methode

<code>class R{function($r,$c){$this->r[$r]=$c;} function($r){$this->r[$r]();}}
$r=new R;
$r->a('/', function(){echo 'hello world';});
$r->e('/');
</code>

Die Kernidee von MVC besteht darin, Schnittstelle und Logik zu trennen. Ich persönlich denke, dass es nichts mit Front-End-Routing zu tun hat, sondern nur mit der Vereinheitlichung des Eingangs.

Betrachten Sie das Problem nicht als zu kompliziert. Es geht eigentlich nur darum, den String zu extrahieren und ihn dann in das Array einzufügen.

<code><?php
$_SERVER['REQUEST_URI'] = '/post/edit/1024?foo=bar';
$uri = explode('/', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
var_export($uri);
//输出
array (
  0 => '',
  1 => 'post', //控制器(控制器存在就require)
  2 => 'edit', //方法
  3 => '1024', //参数(获取参数foo就用传统的$_GET['foo'])
)

$class = $uri[1];
require 'controller/'.$class.'.php'; // controller/post.php
$object = new $class();
$action = $uri[2];
$parameter = $uri[3];
echo call_user_func_array(array($object, $action), array($parameter)); //调用对象里的方法并传参

controller/post.php:
class post {
    public function edit($id) {
        return '$'.__CLASS__.'->'.__FUNCTION__.'('.$id.')'; //输出 $post->edit(1024)
    }
}</code>

Dies ist ein kleines Framework, das ich kürzlich geschrieben habe. Ich denke, es ist in Ordnung, einen Blick darauf zu werfen.
Adresse: https://github.com/zhoujiangy...
Die Route im Kernordner ist die Routing-Implementierungsklasse

Die Grundidee besteht darin, dass der Browser den Namen der Controller-Klasse und den Namen der Methode über die URL-Zeichenfolge bereitstellt und PHP die entsprechende Klasse und Methode entsprechend findet.

Der spezifische Democode kann hier angeklickt werden, http://www.jianshu.com/p/d4ce...

Sie können versuchen, sich das Routing von ci anzusehen. Verwenden Sie den Iteratormodus, um benutzerdefinierte Routen zu iterieren und Werte zu iterieren, die mit SERVER['REQUEST_URI'] übereinstimmen, dh Controller und Methoden herauszunehmen die entsprechende Methode mit der neuen class->-Methode oder call_user_func();

Geben Sie Geld aus, um sich das Cloud-Kauf-Tutorial anzusehen. Der Beamte hat detaillierte Routing-Anweisungen

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn