In letzter Zeit muss ich für meine Arbeit das PHP-Framework cakephp verwenden. Da ich es vorher weniger verwendet habe und in letzter Zeit einige Handbücher gelesen habe, habe ich das Gefühl, dass einige Dinge in cakephp nicht ganz klar sind, also habe ich mich für eins entschieden Schauen Sie sich den Quellcode an. Hier sind einige Anmerkungen beim Lesen.
Ich denke, wenn Sie daran interessiert sind, dieses Dokument anzuzeigen, ist es am besten, die entsprechende PHP-Datei zu öffnen und sie zu überprüfen, sonst wissen Sie möglicherweise nicht, was Ich spreche davon.
Start:
Wenn wir standardmäßig aus dem Internet herunterladen und installieren, gibt es App, Kuchen, drei Verzeichnisse sowie .htaccess- und index.php-Dateien.
Laut den manuellen Anweisungen und Erfahrungen ist das Kuchenverzeichnis der Kerncode des Frameworks und ein Verzeichnis, das während der Entwicklung nicht berührt werden muss. Dies wird für uns hilfreich sein, den Framework-Kern zu aktualisieren in der Zukunft. Wenn Sie während des Entwicklungsprozesses eine eigene Klasse schreiben müssen, können Sie die Datei im Vendors-Verzeichnis ablegen und sie mit Methoden wie app::import aufrufen. .htaccess und index.php übergeben die Standardzugriffsanforderung zur Ausführung an die Datei app/webroot/index.php (wenn der Server .htaccess nicht unterstützt, müssen Sie die Datei index.php erneut ändern). Bestimmen Sie, dass die App unser Standard-Hauptschlachtfeld ist (Natürlich kann dies geändert werden, wenn sich beispielsweise mehrere Anwendungen einen Kern teilen, ich werde hier nicht auf Details eingehen)
Nach dem Öffnen der App/Webroot/Index Wir werden feststellen, dass diese Datei sehr einfach zu schreiben ist. Der erste Teil des Codes definiert einige grundlegende Pfadkonstanten (z. B. App-Pfad, Verzeichnispfad usw.), gefolgt von einer Datei cake/bootstrap.php. Was diese Datei zum Laden aller Framework-Informationen und zur Initialisierung benötigt, schauen wir uns an, was sie bewirkt.
Das Folgende ist Teil des Codes in der Datei bootstrap.php. Ich habe einige Kommentare entsprechend hinzugefügt:
if (!isset($bootstrap)) {
require CORE_PATH . 'cake' . 'basics.php'; // Definieren Sie die allgemeinen Funktionsmethoden
$TIME_START = getMicrotime();
require CORE_PATH .php'; //Dateipfad-Definitionsdatei
require LIBS . //Übergeordnete Klasse aller Klassen
require LIBS Pluralzahlen wurden in Kamel-Schreibweise usw. benannt: Beispielsweise gibt Inflector::pluralize('example') „examples“ zurück
require LIBS ’configure.php’; //Konfigurationsparameterklasse – das wichtige Laden class app::import ist darin definiert, wir können es in Zukunft verwenden, um Klassendateien zu importieren
🎜> require LIBS ’cache.php’; //Laden der Cache-Engine-Klasse
$Dispatcher = new Dispatcher(); //Initialisierungspfadverarbeitungsklasse
$Dispatcher->dispatch($url); //Das Framework beginnt mit der Bestimmung des URL-Ausführungsprogramms
Sehen wir uns an, wie das Framework den Dispatcher lädt und das Programm ausführt!
Code wie:
$url = $this->getUrl(); //Den URL-Pfad abrufen
$this->params = array_merge($this->parseParams($url), $additionalParams); Holen Sie sich das Array nach der Verarbeitung der URL, einschließlich der von $_POST und $_GET übergebenen Werte sowie des Controllers und der Methode
Das Programm verarbeitet die URL-Parameter über die parseParams-Methode und ruft die Routenklassenmethode auf, um den Controller abzurufen , Aktion und andere Informationen und fügen sie in eine reguläre Array-Form zusammen und übergeben sie dann an $this->params. Es ist erwähnenswert, dass im folgenden Code $this->params $controller->params zugewiesen wird Aus diesem Grund können wir $this- im Controller >The reason für params verwenden, zum Beispiel: $this->params['controller'] erhält den Controllernamen der aktuellen Anfrage
Dann wird es Beurteilen Sie die aktuelle Aktion, beispielsweise wenn vor dem Aktionsnamen ein Unterstrich (_) steht. Es wird davon ausgegangen, dass auf die geschützte Methode nicht zugegriffen werden kann
Als nächstes werden dem aktuellen Controller einige Parameter zugewiesen
Der Code ist wie folgt
$controller->base = $this->base;
$ controller->here = $this->here;
$controller->webroot = $this- >webroot;
$controller->plugin = $this->plugin;
$controller->params =& $this->params; //Alle Parameter an $controller-> übergeben Plugin, einschließlich Controller- und Aktionsnamen, Formulardaten, URL usw.
$controller->action = & $this->params['action'];
$controller->passedArgs = array_merge( $this->params['pass'], $this->params['named']); //Alle von $_GET übergebenen Parameter $controller->passedArgs zuweisen, einschließlich der Frage, ob es benannte Parameter gibt, z als /controller/action/a:1/b=2/3/4
(Hinweis: Wenn der Controller die Rendermethode ausführt, werden automatisch einige Variablen an die Ansicht übergeben, die wir aufrufen Beispielsweise weist der Controller den übergebenenArgs in der Ansicht den Variablenwert „passedArgs“ zu, sodass wir „$this->passedArgs“ direkt in der Vorlage aufrufen können.
Hier ist zu beachten, dass das Framework dies tut Bestimmen Sie, ob in der aktuellen Operation $_POST, $_GET und andere Werte vorhanden sind. Wenn $_POST ein Feld mit dem Namen data hat, führt das Framework $controller->data =& $this ->params['data' aus. ];
Die zuletzt geänderte Methode ruft den aktuellen Controller auf und übergibt die Parameter zur Ausführung
Der Code lautet wie folgt: return $this->_invoke($controller, $this- > ;params); //Parameter über Adressreferenz an $controller übergeben, $controller aufrufen und formal ausführen
Sehen wir uns die aufgerufene _invoke
Funktion _invoke(&$controller, $params)
function _invoke(&$controller, $params) {
$controller->constructClasses(); //Laden Sie die erforderlichen Controller-Informationen und führen Sie appController usw. zusammen (einschließlich Lademodell, Helfer und Komponente), mehr Für Weitere Informationen finden Sie in der Klassenmethode unter controller.php
$controller->Component->initialize($controller); // Rufen Sie die Initialisierungsmethode der Komponente vor dem Controller beforeFilter
$controller->beforeFilter auf ();
$controller->Component->startup($controller);
Hier können wir sehen, dass $controller->Component->initialize in $controller-> beforeFilter ist () wurde schon einmal ausgeführt, dieses Handbuch hat es erwähnt, ich werde nicht auf Details eingehen
Hier ist zu beachten, dass die
$controller->constructClasses-Methode die aktuelle benutzerdefinierte Controller-Klasse zusammenführt und AppController (app_controller .php), wie z. B. $users, helper und Component usw. Wichtiger ist hier, dass er die Werte unter allen $users-Variablen durchläuft und das entsprechende Modell lädt Die Variable ;uses ist falsch, dann wird kein Modell initialisiert: Beachten Sie, dass diese Variable leer sein sollte, wenn Sie nur den Controller definieren möchten, ohne die entsprechende Modelldatei zu definieren, oder wenn Sie beim Aufruf des Controllers automatisch andere Modelle laden möchten , Sie können den gewünschten Modellnamen über ein Array zu $this->users=array('modelname1','modelname2') usw. hinzufügen. Eine andere Situation ist, wenn der Benutzer den Wert von $ nicht festlegt Benutzer selbst, das Framework versucht automatisch, das entsprechende Modell aufzurufen (die Modelldatei ist nicht erforderlich, aber zu diesem Zeitpunkt muss eine entsprechende Tabelle in der Datenbank vorhanden sein, sonst wird ein Fehler gemeldet)
Andere Erklärungen sollten nicht erforderlich sein
Folgendes
$output = $controller->dispatchMethod($params['action'], $params['pass']);
Diese Methode ruft die DispatchMethod-Methode in der Objektklasse auf, die eigentlich der Controller ist. Die Klasse führt die entsprechende Aktionsmethode aus
Das Folgende ist ein kleiner Codeausschnitt
if ($controller->autoRender) {
$controller->output = $controller->render();
} elseif (empty($controller->output)) {
$controller->output = $output;
{ HTML
Die Ausführungsschritte dieses Frameworks sind im Grunde abgeschlossen. Natürlich gibt es noch viele Dinge, die nicht darin geschrieben wurden, erstens aufgrund meiner begrenzten Schreibfähigkeiten und zweitens, weil es welche gibt Zu viele aufgerufene Funktionen. Ich werde sie hier nicht einzeln erklären.
Dies ist nur eine vereinfachte Ausführung. Sie können es nicht als Referenz verwenden dass das Lesen des Quellcodes einfacher zu verstehen ist als das Lesen des Handbuchs