Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Mikroframework-Design

PHP-Mikroframework-Design

高洛峰
高洛峰Original
2017-02-09 09:39:233557Durchsuche

1. Gesamtanalyse des Frameworks
Bevor wir ein Framework implementieren, müssen wir verstehen, welche Wirkung das Framework erzielen soll. Gemäß den Vorstellungen traditioneller Frameworks können wir die folgenden Punkte grob zusammenfassen:
1. Implementierung Die MVC-Architektur trennt die Steuerungs-, Logik- und Ansichtsebenen.
2. Kapseln Sie verschiedene Funktionen und Funktionsmodule, um das Schreiben an einem Ort und das Aufrufen an mehreren Orten zu ermöglichen und so die Coderedundanz zu reduzieren.
3. Einfach zu erweitern, Sie können problemlos externe Erweiterungsbibliotheken einführen, um Ihr eigenes Framework zu erweitern.
4. Wählen Sie das Designmuster aus und kapseln oder schreiben Sie verschiedene Engine-Module.
Die grundlegenden Framework-Anforderungen sind ungefähr so. Mit diesen Anforderungen ist der nächste Schritt der Entwurf einer Architektur. Es gibt viele Probleme, die Schritt für Schritt gelöst werden müssen.

2. Framework-Designprozess
1. Framework-Verzeichnis
Dies ist tatsächlich ein sehr wichtiger Schritt. Abhängig von Ihrer Wahl wird die endgültige Verzeichnisstruktur sehr unterschiedlich sein Schichten Darüber hinaus müssen auch Erweiterungsbibliotheken, Front-End-Dateien, Vorlagen, Ressourcendateien usw. in Verzeichnissen abgelegt werden, um zu bestimmen, ob es für Sie bequem ist, sie später aufzurufen. Ich habe hier die Smaty-Engine als Ansichts-Engine verwendet Framework-Design. Die Verzeichnisstruktur ist ungefähr wie folgt:

PHP微型框架设计

Dieses Bild zeigt die Struktur eines zweistufigen Verzeichnisses. Die detaillierteren Verzeichnisse werden nicht einzeln angezeigt Aufgrund der eingeschränkten Bildanzeige und jedes Verzeichnisses und der Hauptdateien werden die Funktionen später einzeln besprochen.

2. Verzeichnis-Einführung
(1) Datenverzeichnis
Da die Smarty-Engine verwendet wird, müssen das Pufferverzeichnis und das Cache-Verzeichnis konfiguriert werden Die Smarty-Engine ist also die Rolle des Datenverzeichnisses.
(2) Framework-Verzeichnis
Dieses Verzeichnis ist der Kern unseres Frameworks, und das Datenbankverzeichnis enthält unsere Datenbankbetriebsfunktionsbibliothek. Im Funktionsverzeichnis befindet sich eine Datei „function.php“. Die Hauptfunktion dieser Datei besteht darin, die schnelle Instanziierung von Methodenaufrufen auf jeder Ebene im M-Modus („do“) zu ermöglichen. Das libs-Verzeichnis platziert die Kern-Factory-Klassendateien des Frameworks, z. B. Datenbankoperationsklassen und Ansichtsoperationsklassen, um externen Dateien den Aufruf der darin enthaltenen Methoden wie DB::funtion() zu erleichtern. View platziert die Smarty View Engine. include.list.php ist die Datei, die unser Framework beim Aufruf einschließen muss. Alle werden in einem Array gespeichert. PC.php ist unsere Framework-Start-Engine, die für die einheitliche Initialisierung jedes unserer Module und das Parsen unserer URLs verantwortlich ist.
(3) img-Verzeichnis
wird zum Platzieren unserer Style-Dateien, JS-Dateien und anderer zugehöriger Ressourcendateien verwendet
(4) libs-Verzeichnis
Obwohl der Name dieses Verzeichnisses derselbe ist wie der des libs-Verzeichnisses Unter dem Framework ist jedoch ersichtlich, dass die entsprechenden Geschäftsverarbeitungsinhalte in den drei Schichten von MVC und einem Organisationserweiterungsverzeichnis in diesem Verzeichnis abgelegt werden.
(5) tpl-Verzeichnis
In diesem Verzeichnis werden einige Vorlagendateien für die Front-End-Anzeige abgelegt. Sie können sehen, dass ich zwei Verzeichnisse, admin und index, zum Speichern von Vorlagendateien im Front-End und im Back-End abgelegt habe jeweils.
(6) admin.php und index.php
Im Allgemeinen wird bei Verwendung der MVC-Architektur der Single-Entry-Modus verwendet, und diese beiden Dateien sind die Eintragsdateien des Single-Entry-Modus zum Starten des Frameworks.
(7) config.php
Dies ist grundsätzlich in allen Frameworks verfügbar. Die Konfigurationsdatei umfasst beispielsweise die Datenbankkonfiguration, die Smarty-Engine-Konfiguration und die Definition einiger statischer Variablen.
Alle diese Strukturen sind nur eine Grundstruktur des Mikro-Frameworks. Tatsächlich verfügen komplexe Frameworks über viele erweiterte Funktionen und externe Plug-Ins, und an dieser Verzeichnisstruktur können entsprechende Anpassungen vorgenommen werden.

3. Kernpunkte des Frameworks
(1) Dynamischer Aufruf des Controllers
Die übliche URL im Single-Entry-Modus ähnelt wahrscheinlich index.php?controller=controller&method=method, welches durch die Get-Methode erhalten wird Nach den Controller- und Methodennamen können wir die dynamische Initialisierung auf folgende Weise durchführen

function C($name,$method){
require_once('/libs/Controller/'.$name.'Controller.class.php');
eval('$obj=new '.$name.'Controller();$obj->'.$method.'();');
}
function M($name){
require_once('/libs/Model/'.$name.'Model.class.php');
eval('$obj=new '.$name.'Model();');
return $obj;
}
function V($name){
require_once('/libs/View/'.$name.'View.class.php');
eval('$obj=new '.$name.'View();');
return $obj;
}

(2) Native Methodentransformation
Freunde, die mit Smarty vertraut sind, sollten das wissen Smarty verfügt über zwei Methoden: Zuweisen und Anzeigen. Sie werden verwendet, um Variablen bzw. Ausgabevariablen in Vorlagendateien zu registrieren. Die gleichzeitige Registrierung mehrerer Variablen macht unseren Code jedoch sehr kompliziert. Daher versuchen wir, diese beiden Methoden umzuwandeln

public static function assign($data){
foreach ($data as $key => $value) {
self::$view->assign($key,$value);
}
}
public static function display($template){
self::$view->display($template);
}

Wir lassen die Zuweisungsmethode so umschreiben, dass sie das Array direkt registrieren kann, wodurch die Menge unseres nachfolgenden Codes reduziert wird. Wenn wir andere externe Bibliotheken einführen möchten, können wir diese Methode auch zum Transformieren der nativen verwenden Funktion, um es anwendbarer zu machen.
(3) Datei enthält Logik
Die Startdatei dieses Frameworks ist pc.php. Daher enthält pc.php grundsätzlich die für das gesamte Framework erforderlichen Dateien. Schauen Sie sich zunächst einen Eintragsdateiindex an. PHP-Inhalt.

header("Content-type:text/html;charset=utf-8");
date_default_timezone_set('Asia/Shanghai');
require_once('config.php');
require_once('framework/pc.php');
PC::run($config)

Es ist sehr einfach. Es enthält die Konfigurationsdatei und das Framework zum Starten der Engine pc.php und ruft dann die Ausführungsmethode auf, um das Framework zu starten 🎜>

$currentdir=dirname(__FILE__);
include_once($currentdir.'/include.list.php');
foreach ($paths as $path) {
include_once($currentdir.'/'.$path);
}
/**
* 完成一系列的初始化和调用控制器
*/
class PC
{
public static $controller;
public static $method;
private static $config;
private static function init_db(){
DB::init('mysql',self::$config['dbconfig']);
}
private static function init_view(){
VIEW::init('Smarty',self::$config['viewconfig']);
}
private static function init_controller(){
self::$controller=isset($_GET['controller'])?daddslashes($_GET['controller']):'index';
}
private static function init_method(){
self::$method=isset($_GET['method'])?daddslashes($_GET['method']):'index';
}
public static function run($config){
self::$config = $config;
self::init_db();
self::init_view();
self::init_controller();
self::init_method();
C(self::$controller,self::$method);
}
}
foreach durchläuft alle Dateien in include.list.php und übergibt den Controller und die entsprechende Methode zur automatischen Einbindung an die C-Klasse. Schauen Sie sich noch einmal an, was in include.list.php

enthalten ist

$paths=$arrayName = array(
'function/function.php',
'libs/core/DB.class.php',
'libs/core/VIEW.class.php',
'db/mysql.class.php',
'view/Smarty/Smarty.class.php'
);

这里面存储了一个数组,包含了咱们的两个工厂类、数据库操作类、外部引擎类、核心function类。
至此,可以梳理一下整个框架对一个url请求的处理流程:

PHP微型框架设计

(4)业务分离
mvc的核心就在于各层之间的严格分离,但Controller层和Model经常容易被混淆在一起,这样会导致mvc架构失去原有的意义,我们需要清楚,控制层只实现简单的控制和逻辑处理,不涉及到具体的业务和数据交互,所有的具体操作都应放到Model层。另外,这两层中的类名和文件名也应保持一致。
(5)方法控制
我们在通过url的形式调用控制器及方法时,某些方法是不想被外部调用到的,比如登录检查函数,这个时候我们可以通过将函数定义为私有函数的方式避免其直接被通过url的形式调用到,来防止风险的发生。
(6)扩展性设计
一个框架应该具备好的扩展性,尤其对于新外部库引入,应该能很容易通过简单修改就可以使用,因此应该将配置项单独分离存储。

三、总结
该框架基本设计就是这个样子,很简单,但基本实现了mvc架构,虽然和市面上的成熟框架相差很多,但重写一遍对于mvc的架构理解会更加深入,加之如今越来越多的网站都采用的这种单入口mvc架构,对于这类网站的渗透更需要很好的理解。


1. Gesamtanalyse des Frameworks
Bevor wir ein Framework implementieren, müssen wir verstehen, welche Wirkung das Framework erzielen soll. Gemäß den Vorstellungen traditioneller Frameworks können wir die folgenden Punkte grob zusammenfassen:
1. Implementierung Die MVC-Architektur trennt die Steuerungs-, Logik- und Ansichtsebenen.
2. Kapseln Sie verschiedene Funktionen und Funktionsmodule, um das Schreiben an einem Ort und das Aufrufen an mehreren Orten zu ermöglichen und so die Coderedundanz zu reduzieren.
3. Einfach zu erweitern, Sie können problemlos externe Erweiterungsbibliotheken einführen, um Ihr eigenes Framework zu erweitern.
4. Wählen Sie das Designmuster aus und kapseln oder schreiben Sie verschiedene Engine-Module.
Die grundlegenden Framework-Anforderungen sind ungefähr so. Mit diesen Anforderungen ist der nächste Schritt der Entwurf einer Architektur. Es gibt viele Probleme, die Schritt für Schritt gelöst werden müssen.

2. Framework-Designprozess
1. Framework-Verzeichnis
Dies ist tatsächlich ein sehr wichtiger Schritt. Abhängig von Ihrer Wahl wird die endgültige Verzeichnisstruktur sehr unterschiedlich sein Schichten Darüber hinaus müssen auch Erweiterungsbibliotheken, Front-End-Dateien, Vorlagen, Ressourcendateien usw. in Verzeichnissen abgelegt werden, um zu bestimmen, ob es für Sie bequem ist, sie später aufzurufen. Ich habe hier die Smaty-Engine als Ansichts-Engine verwendet Framework-Design. Die Verzeichnisstruktur ist ungefähr wie folgt:

PHP微型框架设计

Dieses Bild zeigt die Struktur eines zweistufigen Verzeichnisses. Die detaillierteren Verzeichnisse werden nicht einzeln angezeigt Aufgrund der eingeschränkten Bildanzeige und jedes Verzeichnisses und der Hauptdateien werden die Funktionen später einzeln besprochen.

2. Verzeichnis-Einführung
(1) Datenverzeichnis
Da die Smarty-Engine verwendet wird, müssen das Pufferverzeichnis und das Cache-Verzeichnis konfiguriert werden Die Smarty-Engine ist also die Rolle des Datenverzeichnisses.
(2) Framework-Verzeichnis
Dieses Verzeichnis ist der Kern unseres Frameworks, und das Datenbankverzeichnis enthält unsere Datenbankbetriebsfunktionsbibliothek. Im Funktionsverzeichnis befindet sich eine Datei „function.php“. Die Hauptfunktion dieser Datei besteht darin, die schnelle Instanziierung von Methodenaufrufen auf jeder Ebene im M-Modus („do“) zu ermöglichen. Das libs-Verzeichnis platziert die Kern-Factory-Klassendateien des Frameworks, z. B. Datenbankoperationsklassen und Ansichtsoperationsklassen, um externen Dateien den Aufruf der darin enthaltenen Methoden wie DB::funtion() zu erleichtern. View platziert die Smarty View Engine. include.list.php ist die Datei, die unser Framework beim Aufruf einschließen muss. Alle werden in einem Array gespeichert. PC.php ist unsere Framework-Start-Engine, die für die einheitliche Initialisierung jedes unserer Module und das Parsen unserer URLs verantwortlich ist.
(3) img-Verzeichnis
wird zum Platzieren unserer Style-Dateien, JS-Dateien und anderer zugehöriger Ressourcendateien verwendet
(4) libs-Verzeichnis
Obwohl der Name dieses Verzeichnisses derselbe ist wie der des libs-Verzeichnisses Unter dem Framework ist jedoch ersichtlich, dass die entsprechenden Geschäftsverarbeitungsinhalte in den drei Schichten von MVC und einem Organisationserweiterungsverzeichnis in diesem Verzeichnis abgelegt werden.
(5) tpl-Verzeichnis
In diesem Verzeichnis werden einige Vorlagendateien für die Front-End-Anzeige abgelegt. Sie können sehen, dass ich zwei Verzeichnisse, admin und index, zum Speichern von Vorlagendateien im Front-End und im Back-End abgelegt habe jeweils.
(6) admin.php und index.php
Im Allgemeinen wird bei Verwendung der MVC-Architektur der Single-Entry-Modus verwendet, und diese beiden Dateien sind die Eintragsdateien des Single-Entry-Modus zum Starten des Frameworks.
(7) config.php
Dies ist grundsätzlich in allen Frameworks verfügbar. Die Konfigurationsdatei umfasst beispielsweise die Datenbankkonfiguration, die Smarty-Engine-Konfiguration und die Definition einiger statischer Variablen.
Alle diese Strukturen sind nur eine Grundstruktur des Mikro-Frameworks. Tatsächlich verfügen komplexe Frameworks über viele erweiterte Funktionen und externe Plug-Ins, und an dieser Verzeichnisstruktur können entsprechende Anpassungen vorgenommen werden.

3. Kernpunkte des Frameworks
(1) Dynamischer Aufruf des Controllers
Die übliche URL im Single-Entry-Modus ähnelt wahrscheinlich index.php?controller=controller&method=method, welches durch die Get-Methode erhalten wird Nach den Controller- und Methodennamen können wir die dynamische Initialisierung auf folgende Weise durchführen

function C($name,$method){
require_once('/libs/Controller/'.$name.'Controller.class.php');
eval('$obj=new '.$name.'Controller();$obj->'.$method.'();');
}
function M($name){
require_once('/libs/Model/'.$name.'Model.class.php');
eval('$obj=new '.$name.'Model();');
return $obj;
}
function V($name){
require_once('/libs/View/'.$name.'View.class.php');
eval('$obj=new '.$name.'View();');
return $obj;
}

(2) Native Methodentransformation
Freunde, die mit Smarty vertraut sind, sollten das wissen Smarty verfügt über zwei Methoden: Zuweisen und Anzeigen. Sie werden verwendet, um Variablen bzw. Ausgabevariablen in Vorlagendateien zu registrieren. Die gleichzeitige Registrierung mehrerer Variablen macht unseren Code jedoch sehr kompliziert. Daher versuchen wir, diese beiden Methoden umzuwandeln

public static function assign($data){
foreach ($data as $key => $value) {
self::$view->assign($key,$value);
}
}
public static function display($template){
self::$view->display($template);
}

Wir lassen die Zuweisungsmethode so umschreiben, dass sie das Array direkt registrieren kann, wodurch die Menge unseres nachfolgenden Codes reduziert wird. Wenn wir andere externe Bibliotheken einführen möchten, können wir diese Methode auch zum Transformieren der nativen verwenden Funktion, um es anwendbarer zu machen.
(3) Datei enthält Logik
Die Startdatei dieses Frameworks ist pc.php. Daher enthält pc.php grundsätzlich die für das gesamte Framework erforderlichen Dateien. Schauen Sie sich zunächst einen Eintragsdateiindex an. PHP-Inhalt.

header("Content-type:text/html;charset=utf-8");
date_default_timezone_set('Asia/Shanghai');
require_once('config.php');
require_once('framework/pc.php');
PC::run($config)

Es ist sehr einfach. Es enthält die Konfigurationsdatei und das Framework zum Starten der Engine pc.php und ruft dann die Ausführungsmethode auf, um das Framework zu starten 🎜>

$currentdir=dirname(__FILE__);
include_once($currentdir.'/include.list.php');
foreach ($paths as $path) {
include_once($currentdir.'/'.$path);
}
/**
* 完成一系列的初始化和调用控制器
*/
class PC
{
public static $controller;
public static $method;
private static $config;
private static function init_db(){
DB::init('mysql',self::$config['dbconfig']);
}
private static function init_view(){
VIEW::init('Smarty',self::$config['viewconfig']);
}
private static function init_controller(){
self::$controller=isset($_GET['controller'])?daddslashes($_GET['controller']):'index';
}
private static function init_method(){
self::$method=isset($_GET['method'])?daddslashes($_GET['method']):'index';
}
public static function run($config){
self::$config = $config;
self::init_db();
self::init_view();
self::init_controller();
self::init_method();
C(self::$controller,self::$method);
}
}
foreach durchläuft alle Dateien in include.list.php und übergibt den Controller und die entsprechende Methode zur automatischen Einbindung an die C-Klasse. Schauen Sie sich noch einmal an, was in include.list.php

enthalten ist

$paths=$arrayName = array(
'function/function.php',
'libs/core/DB.class.php',
'libs/core/VIEW.class.php',
'db/mysql.class.php',
'view/Smarty/Smarty.class.php'
);

这里面存储了一个数组,包含了咱们的两个工厂类、数据库操作类、外部引擎类、核心function类。
至此,可以梳理一下整个框架对一个url请求的处理流程:

PHP微型框架设计

(4)业务分离
mvc的核心就在于各层之间的严格分离,但Controller层和Model经常容易被混淆在一起,这样会导致mvc架构失去原有的意义,我们需要清楚,控制层只实现简单的控制和逻辑处理,不涉及到具体的业务和数据交互,所有的具体操作都应放到Model层。另外,这两层中的类名和文件名也应保持一致。
(5)方法控制
我们在通过url的形式调用控制器及方法时,某些方法是不想被外部调用到的,比如登录检查函数,这个时候我们可以通过将函数定义为私有函数的方式避免其直接被通过url的形式调用到,来防止风险的发生。
(6)扩展性设计
一个框架应该具备好的扩展性,尤其对于新外部库引入,应该能很容易通过简单修改就可以使用,因此应该将配置项单独分离存储。

3. Zusammenfassung
Das grundlegende Design des Frameworks ist sehr einfach, aber es implementiert im Grunde die MVC-Architektur, obwohl es sich stark von den ausgereiften Frameworks auf dem Markt unterscheidet Ein tieferes Verständnis der MVC-Architektur. Darüber hinaus übernehmen heutzutage immer mehr Websites diese Single-Entry-MVC-Architektur, und die Durchdringung solcher Websites erfordert ein gutes Verständnis.

Weitere Artikel zum PHP-Mikroframework-Design finden Sie auf der chinesischen PHP-Website!

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