PHP MVC Framework Core Class
Nun geben wir ein paar Kern-Framework-Beispiele: Erstellen Sie eine Framework.class.php-Datei unter „framework/core“. Schreiben Sie den folgenden Code:
// Framework/core/Framework.class.php
class Framework {
public static function run() {
echo "run()"
}
require "framework/core/Framework.class.php";
Framework::run();
Sie können es sehen, indem Sie index.php in Ihrem Browser-Ergebnis aufrufen. Normalerweise heißt diese statische Methode run() oder bootstrap(). Bei dieser Methode müssen wir im Wesentlichen drei Dinge tun:
class Framework {
public static function run() {
// echo "run()"; ();
self::autoload();
self::dispatch();
}
private static function init() {
}
private static function autoload() {
}
private statische Funktion Dispatch() {
}
}
Initialisierung
init()-Methode:
// Initialisierung
private static function init() {
// Pfadkonstanten definieren
define("DS", DIRECTORY_SEPARATOR);
define("ROOT", getcwd( ) . DS );
define("APP_PATH", ROOT . 'application' . DS);
define("FRAMEWORK_PATH", ROOT . "framework" . DS); define("PUBLIC_PATH", ROOT . "public" . DS);
define("CONFIG_PATH", APP_PATH . "config" . DS);
define("CONTROLLER_PATH" , APP_PATH . "controllers" . DS);
define("MODEL_PATH", APP_PATH . "models" . DS ); 🎜>
define("CORE_PATH", FRAMEWORK_PATH . "core" . DS);
define('DB_PATH', FRAMEWORK_PATH . "database" . DS);
define("HELPER_PATH", FRAMEWORK_PATH . "helpers" . DS);
define("UPLOAD_PATH", PUBLIC_PATH . "uploads" . DS); Controller, Aktion, zum Beispiel:
// index.php?p=admin&c=Goods&a=add
define("PLATFORM", isset($_REQUEST['p']) ? $ _REQUEST['p'] : 'home');
define("CONTROLLER", isset($_REQUEST['c']) ? $_REQUEST['c'] : 'Index'); >
define("ACTION", isset($_REQUEST['a']) ? $_REQUEST['a'] : 'index' );
define ("CURR_CONTROLLER_PATH", CONTROLLER_PATH . PLATFORM . DS); Loader.class.php";
erfordern DB_PATH . "Mysql.class.php ";
erfordern CORE_PATH . "Model.class.php";
// Konfigurationsdatei laden
$GLOBALS['config'] = include CONFIG_PATH
// Sitzung starten
session_start(}
Sie können das sehen Zweck jedes Schritts in den Kommentaren.
Automatisches Laden
Im Projekt möchten wir das Laden nicht manuell einbinden oder erfordern, wenn wir eine Klasse im Skript verwenden möchten. Aus diesem Grund verfügt das PHP MVC-Framework über eine automatische Ladefunktion. Wenn Sie beispielsweise in Symfony eine Klasse unter lib laden möchten, wird diese automatisch importiert. Erstaunlich, oder? Fügen wir nun unserem Framework die Funktion zum automatischen Laden hinzu.
Hier verwenden wir die integrierte Funktion spl_autoload_register in PHP:
// Automatisches Laden
private statische Funktion autoload(){
spl_autoload_register (array (__CLASS__,'load'));
}
// Definieren Sie eine benutzerdefinierte Lademethode
private static function load($classname){
// Hier einfach Controller- und Modellklassen der App automatisch laden
if (substr($classname, -10) == "Controller"){
// Controller
require_once CURR_CONTROLLER_PATH > Für eine Controller-Klasse muss sie etwa xxxController.class.php heißen, und für eine Modellklasse muss sie xxModel.class.php heißen. Warum müssen Sie bei der Verwendung eines Frameworks die Benennungsregeln befolgen? Automatisches Laden ist ein Grund.
Routing/Verteilung
// Routing und Dispatching
private statische Funktion Dispatch(){
// Instanziieren Sie die Controller-Klasse und rufen Sie ihre Aktionsmethode auf
$controller_name = "Controller";
$action_name = "Action"
$controller-> ;$action_name();
}
In diesem Schritt verteilt index.php die Anfrage an die entsprechende Controller::Aciton()-Methode.
Basis-Controller-Klasse
Normalerweise gibt es einen Basis-Controller in der Kernklasse des Frameworks. In Symfony heißt es sfAction; in iOS heißt es UIViewController. Hier nennen wir es Controller und erstellen Controller.class.php unter Framework/core
// Base Controller
class Controller{
// Base Controller hat eine Eigenschaft namens $ Loader, es ist eine Instanz der Loader-Klasse (später eingeführt)
protected $loader;
public function __construct(){
$this->loader = new Loader();
public Funktion Redirect($url,$message,$wait = 0){
if ($wait == 0){
header("Location:$url"); else {
include CURR_VIEW_PATH . "message.html";
}
exit;
}
Der Basiscontroller verfügt über eine Variable $loader, die eine Instanziierung der Loader-Klasse ist (später beschrieben) . Genauer gesagt ist $this->loader eine Variable, die auf die instanziierte Load-Klasse zeigt. Ich werde hier nicht zu viel darüber diskutieren, aber es ist in der Tat ein sehr Schlüsselkonzept. Ich habe einige PHP-Entwickler getroffen, die glauben, dass nach dieser Aussage:
$this->loader = new Loader();
$this->load ein Objekt ist. Nein, es ist nur eine Referenz. Dies wird seit Java verwendet und vor Java wurde es in C und Objective C als Zeiger bezeichnet. Eine Referenz ist ein gekapselter Zeigertyp. In iOS (O-C) haben wir beispielsweise ein Objekt erstellt:
UIButton *btn = [UIButton alloc] init]; Anwendungscontroller und -modelle. Aber wie lädt man Klassen automatisch in das Framework-Verzeichnis? Jetzt können wir eine neue Loader-Klasse erstellen, die die Klassen und Funktionen in das Framework-Verzeichnis lädt. Wenn wir die Framework-Klasse laden, müssen wir nur die Methode in dieser Loader-Klasse aufrufen.
class Loader{
// Bibliotheksklassen laden
öffentliche Funktionsbibliothek($lib){
include LIB_PATH }
// Loader Hilfsfunktionen. Namenskonvertierung ist xxx_helper.php;
public function helper($helper){
include HELPER_PATH }
}