1. Analyse globale du cadre
Avant de mettre en œuvre un cadre, nous devons comprendre quel effet le cadre doit produire. Selon les idées des cadres traditionnels, nous pouvons résumer grossièrement les points suivants :
1. Implémentation L'architecture MVC sépare les couches de contrôle, de logique et d'affichage.
2. Encapsulez diverses fonctions et modules fonctionnels pour permettre l'écriture en un seul endroit et l'appel à plusieurs endroits, réduisant ainsi la redondance du code.
3. Facile à développer, vous pouvez facilement introduire des bibliothèques d'extensions externes pour améliorer votre propre framework.
4. Sélectionnez le modèle de conception et encapsulez ou écrivez divers modules de moteur.
Les exigences de base du cadre sont à peu près comme ceci. Avec ces exigences, la prochaine étape est la conception d'une architecture. De nombreux problèmes doivent être résolus.
2. Processus de conception du framework
1. Répertoire du framework
Il s'agit en fait d'une étape très importante En fonction de votre choix, la structure finale du répertoire sera très différente en plus de répondre aux trois bases. couches De plus, les bibliothèques d'extensions, les fichiers frontaux, les modèles, les fichiers de ressources, etc. doivent également être placés dans des répertoires, ce qui détermine s'il est pratique pour vous d'appeler plus tard. J'ai utilisé le moteur smaty comme moteur d'affichage dans ce cas. conception du framework. La structure des répertoires est à peu près la suivante :
Cette image montre une structure d'un répertoire à deux niveaux. Les répertoires les plus détaillés ne sont pas affichés un par un. en raison de l'affichage limité des images, chaque répertoire et les fonctions principales des fichiers seront discutées une par une plus tard.
2. Introduction au répertoire
(1) répertoire de données
Vous pouvez voir la structure des répertoires dans l'image ci-dessus Puisque le moteur smarty est utilisé, le répertoire tampon et le répertoire cache doivent être configurés dans. le moteur smarty. C'est donc le rôle du répertoire de données.
(2) Répertoire Framework
Ce répertoire est le cœur de notre framework, et le répertoire db contient notre bibliothèque de fonctions d'opération de base de données. Il existe un fichier function.php placé dans le répertoire des fonctions. La fonction principale de ce fichier est de faciliter l'instanciation rapide des appels de méthode à chaque couche en mode M (« faire »). Le répertoire libs place les fichiers de classe d'usine de base du framework, tels que les classes d'opérations de base de données et les classes d'opérations de vue, pour faciliter l'appel des méthodes par les fichiers externes, comme DB::funtion(). view place le moteur de visualisation intelligent. include.list.php est le fichier que notre framework doit inclure lors de son appel. Tous sont enregistrés dans un tableau. PC.php est notre moteur de démarrage de framework, responsable de l'initialisation unifiée de chacun de nos modules et de l'analyse de nos URL.
(3) répertoire img
est utilisé pour placer nos fichiers de style, fichiers js et autres fichiers de ressources associés
(4) répertoire libs
Bien que le nom de ce répertoire soit le même que le répertoire libs Dans le cadre, mais on peut voir que le contenu de traitement métier correspondant dans les trois couches de MVC et un répertoire d'extension d'organisation sont placés dans ce répertoire. Controller Places Controllers, Model Places Models et View Places View Processing Class.
(5) répertoire tpl
Ce répertoire place certains fichiers modèles pour l'affichage front-end. Vous pouvez voir que j'ai placé deux répertoires, admin et index, pour stocker les fichiers modèles dans le front-end et le back-end. respectivement.
(6) admin.php et index.php
De manière générale, le mode à entrée unique sera utilisé lors de l'utilisation de l'architecture MVC, et ces deux fichiers sont les fichiers d'entrée du mode à entrée unique pour démarrer le framework.
(7) config.php
Ceci est essentiellement disponible dans tous les frameworks. Le fichier de configuration comprend, par exemple, la configuration de la base de données, la configuration du moteur intelligent et la définition de certaines variables statiques.
Toutes ces structures ne sont qu'une structure de base du micro-framework. En fait, les frameworks complexes auront de nombreuses fonctions étendues et plug-ins externes, et les ajustements correspondants peuvent être apportés à cette structure de répertoires.
3. Points clés du framework
(1) Appel dynamique du contrôleur
L'URL habituelle en mode entrée unique est probablement similaire à index.php?controller=controller&method=method, qui est obtenu via la méthode get Après les noms du contrôleur et de la méthode, nous pouvons effectuer une initialisation dynamique des manières suivantes
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) Transformation de méthode native
Les amis qui connaissent smarty devraient savoir que smarty a deux méthodes : assign et display. Elles sont utilisées respectivement pour enregistrer des variables et sortir des variables dans des fichiers modèles, mais l'enregistrement de plusieurs variables en même temps rendra notre code très compliqué, nous essayons donc de transformer ces deux méthodes
public static function assign($data){ foreach ($data as $key => $value) { self::$view->assign($key,$value); } } public static function display($template){ self::$view->display($template); }
Nous laissons la méthode assign être réécrite afin qu'elle puisse enregistrer directement le tableau, ce qui réduira la quantité de notre code ultérieur. Si nous voulons introduire d'autres bibliothèques externes, nous pouvons également utiliser cette méthode pour transformer le natif. fonction pour le rendre plus applicable.
(3) Le fichier contient la logique
Le fichier de démarrage de ce framework est pc.php Par conséquent, y compris pc.php contient essentiellement les fichiers nécessaires à l'ensemble du framework. Tout d'abord, jetez un œil à un index de fichier d'entrée. contenu php.
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)
C'est très simple. Il contient le fichier de configuration et le framework pour démarrer le moteur pc.php, puis appeler la méthode run pour démarrer le framework. Regardez ensuite le contenu de pc.php <.>
$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); } }
$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请求的处理流程:
(4)业务分离
mvc的核心就在于各层之间的严格分离,但Controller层和Model经常容易被混淆在一起,这样会导致mvc架构失去原有的意义,我们需要清楚,控制层只实现简单的控制和逻辑处理,不涉及到具体的业务和数据交互,所有的具体操作都应放到Model层。另外,这两层中的类名和文件名也应保持一致。
(5)方法控制
我们在通过url的形式调用控制器及方法时,某些方法是不想被外部调用到的,比如登录检查函数,这个时候我们可以通过将函数定义为私有函数的方式避免其直接被通过url的形式调用到,来防止风险的发生。
(6)扩展性设计
一个框架应该具备好的扩展性,尤其对于新外部库引入,应该能很容易通过简单修改就可以使用,因此应该将配置项单独分离存储。
三、总结
该框架基本设计就是这个样子,很简单,但基本实现了mvc架构,虽然和市面上的成熟框架相差很多,但重写一遍对于mvc的架构理解会更加深入,加之如今越来越多的网站都采用的这种单入口mvc架构,对于这类网站的渗透更需要很好的理解。
1. Analyse globale du cadre
Avant de mettre en œuvre un cadre, nous devons comprendre quel effet le cadre doit produire. Selon les idées des cadres traditionnels, nous pouvons résumer grossièrement les points suivants :
1. Implémentation L'architecture MVC sépare les couches de contrôle, de logique et d'affichage.
2. Encapsulez diverses fonctions et modules fonctionnels pour permettre l'écriture en un seul endroit et l'appel à plusieurs endroits, réduisant ainsi la redondance du code.
3. Facile à développer, vous pouvez facilement introduire des bibliothèques d'extensions externes pour améliorer votre propre framework.
4. Sélectionnez le modèle de conception et encapsulez ou écrivez divers modules de moteur.
Les exigences de base du cadre sont à peu près comme ceci. Avec ces exigences, la prochaine étape est la conception d'une architecture. De nombreux problèmes doivent être résolus.
2. Processus de conception du framework
1. Répertoire du framework
Il s'agit en fait d'une étape très importante En fonction de votre choix, la structure finale du répertoire sera très différente en plus de répondre aux trois bases. couches De plus, les bibliothèques d'extensions, les fichiers frontaux, les modèles, les fichiers de ressources, etc. doivent également être placés dans des répertoires, ce qui détermine s'il est pratique pour vous d'appeler plus tard. J'ai utilisé le moteur smaty comme moteur d'affichage dans ce cas. conception du framework. La structure des répertoires est à peu près la suivante :
Cette image montre une structure d'un répertoire à deux niveaux. Les répertoires les plus détaillés ne sont pas affichés un par un. en raison de l'affichage limité des images, chaque répertoire et les fonctions principales des fichiers seront discutées une par une plus tard.
2. Introduction au répertoire
(1) répertoire de données
Vous pouvez voir la structure des répertoires dans l'image ci-dessus Puisque le moteur smarty est utilisé, le répertoire tampon et le répertoire cache doivent être configurés dans. le moteur smarty. C'est donc le rôle du répertoire de données.
(2) Répertoire Framework
Ce répertoire est le cœur de notre framework, et le répertoire db contient notre bibliothèque de fonctions d'opération de base de données. Il existe un fichier function.php placé dans le répertoire des fonctions. La fonction principale de ce fichier est de faciliter l'instanciation rapide des appels de méthode à chaque couche en mode M (« faire »). Le répertoire libs place les fichiers de classe d'usine de base du framework, tels que les classes d'opérations de base de données et les classes d'opérations de vue, pour faciliter l'appel des méthodes par les fichiers externes, comme DB::funtion(). view place le moteur de visualisation intelligent. include.list.php est le fichier que notre framework doit inclure lors de son appel. Tous sont enregistrés dans un tableau. PC.php est notre moteur de démarrage de framework, responsable de l'initialisation unifiée de chacun de nos modules et de l'analyse de nos URL.
(3) répertoire img
est utilisé pour placer nos fichiers de style, fichiers js et autres fichiers de ressources associés
(4) répertoire libs
Bien que le nom de ce répertoire soit le même que le répertoire libs Dans le cadre, mais on peut voir que le contenu de traitement métier correspondant dans les trois couches de MVC et un répertoire d'extension d'organisation sont placés dans ce répertoire. Controller Places Controllers, Model Places Models et View Places View Processing Class.
(5) répertoire tpl
Ce répertoire place certains fichiers modèles pour l'affichage front-end. Vous pouvez voir que j'ai placé deux répertoires, admin et index, pour stocker les fichiers modèles dans le front-end et le back-end. respectivement.
(6) admin.php et index.php
De manière générale, le mode à entrée unique sera utilisé lors de l'utilisation de l'architecture MVC, et ces deux fichiers sont les fichiers d'entrée du mode à entrée unique pour démarrer le framework.
(7) config.php
Ceci est essentiellement disponible dans tous les frameworks. Le fichier de configuration comprend, par exemple, la configuration de la base de données, la configuration du moteur intelligent et la définition de certaines variables statiques.
Toutes ces structures ne sont qu'une structure de base du micro-framework. En fait, les frameworks complexes auront de nombreuses fonctions étendues et plug-ins externes, et les ajustements correspondants peuvent être apportés à cette structure de répertoires.
3. Points clés du framework
(1) Appel dynamique du contrôleur
L'URL habituelle en mode entrée unique est probablement similaire à index.php?controller=controller&method=method, qui est obtenu via la méthode get Après les noms du contrôleur et de la méthode, nous pouvons effectuer une initialisation dynamique des manières suivantes
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) Transformation de méthode native
Les amis qui connaissent smarty devraient savoir que smarty a deux méthodes : assign et display. Elles sont utilisées respectivement pour enregistrer des variables et sortir des variables dans des fichiers modèles, mais l'enregistrement de plusieurs variables en même temps rendra notre code très compliqué, nous essayons donc de transformer ces deux méthodes
public static function assign($data){ foreach ($data as $key => $value) { self::$view->assign($key,$value); } } public static function display($template){ self::$view->display($template); }
Nous laissons la méthode assign être réécrite afin qu'elle puisse enregistrer directement le tableau, ce qui réduira la quantité de notre code ultérieur. Si nous voulons introduire d'autres bibliothèques externes, nous pouvons également utiliser cette méthode pour transformer le natif. fonction pour le rendre plus applicable.
(3) Le fichier contient la logique
Le fichier de démarrage de ce framework est pc.php Par conséquent, y compris pc.php contient essentiellement les fichiers nécessaires à l'ensemble du framework. Tout d'abord, jetez un œil à un index de fichier d'entrée. contenu php.
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)
C'est très simple. Il contient le fichier de configuration et le framework pour démarrer le moteur pc.php, puis appeler la méthode run pour démarrer le framework. Regardez ensuite le contenu de pc.php <.>
$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); } }
$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请求的处理流程:
(4)业务分离
mvc的核心就在于各层之间的严格分离,但Controller层和Model经常容易被混淆在一起,这样会导致mvc架构失去原有的意义,我们需要清楚,控制层只实现简单的控制和逻辑处理,不涉及到具体的业务和数据交互,所有的具体操作都应放到Model层。另外,这两层中的类名和文件名也应保持一致。
(5)方法控制
我们在通过url的形式调用控制器及方法时,某些方法是不想被外部调用到的,比如登录检查函数,这个时候我们可以通过将函数定义为私有函数的方式避免其直接被通过url的形式调用到,来防止风险的发生。
(6)扩展性设计
一个框架应该具备好的扩展性,尤其对于新外部库引入,应该能很容易通过简单修改就可以使用,因此应该将配置项单独分离存储。
3.Résumé
La conception de base du framework est la suivante. Elle est très simple, mais elle implémente essentiellement l'architecture MVC. Bien qu'elle soit très différente des frameworks matures du marché, sa réécriture vous donnera des résultats. une compréhension plus approfondie de l'architecture MVC. De plus, de plus en plus de sites Web adoptent aujourd'hui cette architecture MVC à entrée unique, et la pénétration de tels sites Web nécessite une bonne compréhension.
Pour plus d'articles sur la conception de micro-framework PHP, veuillez faire attention au site Web PHP chinois !