1. フレームワークの全体的な分析
フレームワークを実装する前に、従来のフレームワークの考え方に従って、次の点を大まかに要約することができます。
1. MVC アーキテクチャと制御を実装します。ロジック層とビュー層は分離されています。
2. さまざまな関数と機能モジュールをカプセル化して、1 か所で記述し、複数の場所で呼び出しできるようにし、コードの冗長性を削減します。
3. 拡張が簡単で、外部拡張ライブラリを簡単に導入して独自のフレームワークを強化できます。
4. デザインパターンを選択し、さまざまなエンジンモジュールをカプセル化または書き込みます。
基本的なフレームワークの要件は次のとおりです。これらの要件を踏まえて、次のステップでは解決する必要のある多くの問題が含まれます。
2. フレームワークの設計プロセス
1. フレームワークのディレクトリ
これは、基本的な 3 つのレイヤー、拡張ライブラリ、フロントエンドを満たすことに加えて、実際には非常に重要なステップです。ファイル、テンプレート、リソース ファイルなども、それらを配置するディレクトリを見つける必要があります。これにより、後で呼び出すのが便利かどうかが決まります。このフレームワーク設計では、smaty エンジンをビュー エンジンとして使用しました。ディレクトリ構造は大まかに次のとおりです。以下の通りです:
この図は 2 つのレベルのディレクトリの構造を示しています。画像表示が限られているため、より詳細なディレクトリは 1 つずつ表示されません。各ディレクトリと主なファイルの機能については説明します。後は一つずつ。
2. ディレクトリの紹介
(1) データディレクトリ
smarty エンジンを使用するため、smarty エンジン内でバッファディレクトリとキャッシュディレクトリを設定する必要があります。データディレクトリはここにあります。
(2) フレームワークディレクトリ
このディレクトリはフレームワークの中核であり、db ディレクトリにはデータベース操作関数ライブラリが含まれています。 function.php ファイルが function ディレクトリに配置されています。このファイルの主な機能は、M (「do」) モードでの各レイヤーでのメソッド呼び出しの迅速なインスタンス化を容易にすることです。 libs ディレクトリには、データベース操作クラスやビュー操作クラスなどのフレームワークのコア ファクトリ クラス ファイルが配置され、外部ファイルが DB::funtion() などの方法でメソッドを呼び出すことが容易になります。 View は Smarty View エンジンを配置します。 include.list.php は、フレームワークを呼び出すときにインクルードする必要があるファイルです。これらはすべて配列に保存されます。 PC.php はフレームワーク起動エンジンであり、各モジュールの統合初期化と URL の解析を担当します。
(3) img ディレクトリ
はスタイル ファイル、js ファイル、その他の関連リソース ファイルを配置するために使用されます
(4) libs ディレクトリ
このディレクトリの名前はフレームワークの libs ディレクトリと同じですが、次のことがわかります。このディレクトリの下には、MVC の 3 層の対応する業務処理コンテンツと組織拡張ディレクトリが配置されます。Controller はコントローラーを配置し、Model はモデルを配置し、View はビュー処理クラスを配置します。
(5) tpl ディレクトリ
このディレクトリには、フロントエンド表示用のいくつかのテンプレート ファイルが配置されており、フロントエンドとバックエンドにそれぞれテンプレート ファイルを保存するための 2 つのディレクトリが配置されていることがわかります。
(6) admin.phpとindex.php
通常、MVCアーキテクチャを使用する場合はシングルエントリモードが使用され、この2つのファイルがフレームワークを起動するためのシングルエントリモードのエントリファイルとなります。
(7) config.php
基本的にすべてのフレームワークにはこの設定ファイルがあり、データベース設定、Smarty エンジン設定、いくつかの静的変数の定義などが含まれます。
これらの構造はすべてマイクロフレームワークの基本構造にすぎません。実際、複雑なフレームワークには多くの拡張機能や外部プラグインがあり、このディレクトリ構造に対応する調整を行うことができます。
3. フレームワークのポイント
(1) コントローラーの動的呼び出し
シングルエントリーモードでの通常の URL は、get メソッドでコントローラーとメソッド名を取得した後、おそらく Index.php?controller=controller&method=method に似ています。動的初期化は次の方法で実行できます
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) ネイティブメソッド変換
smartyに詳しい人は、smartyにはassignとdisplayという2つのメソッドがあり、変数を登録したりテンプレートに変数を出力したりするのに使用されることを知っているはずです。複数の変数を登録するとコードが非常に煩雑になるため、これら 2 つのメソッドを変換しようとします
public static function assign($data){ foreach ($data as $key => $value) { self::$view->assign($key,$value); } } public static function display($template){ self::$view->display($template); }
配列を直接登録できるように assign メソッドを書き換え、後続のコードの量を削減します。他の外部ライブラリを導入したい場合は、このメソッドを使用してネイティブ関数を変換し、より適用しやすくすることもできます。
(3) ロジックを含むファイル
このフレームワークの起動ファイルは pc.php です。 したがって、pc.php を含めることで、基本的にフレームワーク全体に必要なファイルが含まれます。 まず、エントリーファイル、index.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)
これは非常に簡単です。これには、pc.php エンジンを開始するための構成ファイルとフレームワークが含まれており、次に run メソッドを呼び出してフレームワークを開始します。次に、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); } }
含まれるすべてのファイルを走査します。 include.list.php ファイルに追加し、コントローラーと対応するメソッドを C クラスに渡して自動的に含めます。 include.list.php に何が含まれているかをもう一度見てください
$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. フレームワークの全体的な分析
フレームワークを実装する前に、従来のフレームワークの考え方に従って、次の点を大まかに要約することができます。
1. MVC アーキテクチャと制御を実装します。ロジック層とビュー層は分離されています。
2. さまざまな関数と機能モジュールをカプセル化して、1 か所で記述し、複数の場所で呼び出しできるようにし、コードの冗長性を削減します。
3. 拡張が簡単で、外部拡張ライブラリを簡単に導入して独自のフレームワークを強化できます。
4. デザインパターンを選択し、さまざまなエンジンモジュールをカプセル化または書き込みます。
基本的なフレームワークの要件は次のとおりです。これらの要件を踏まえて、次のステップでは解決する必要のある多くの問題が含まれます。
2. フレームワークの設計プロセス
1. フレームワークのディレクトリ
これは、基本的な 3 つのレイヤー、拡張ライブラリ、フロントエンドを満たすことに加えて、実際には非常に重要なステップです。ファイル、テンプレート、リソース ファイルなども、それらを配置するディレクトリを見つける必要があります。これにより、後で呼び出すのが便利かどうかが決まります。このフレームワーク設計では、smaty エンジンをビュー エンジンとして使用しました。ディレクトリ構造は大まかに次のとおりです。以下の通りです:
この図は 2 つのレベルのディレクトリの構造を示しています。画像表示が限られているため、より詳細なディレクトリは 1 つずつ表示されません。各ディレクトリと主なファイルの機能については説明します。後は一つずつ。
2. ディレクトリの紹介
(1) データディレクトリ
smarty エンジンを使用するため、smarty エンジン内でバッファディレクトリとキャッシュディレクトリを設定する必要があります。データディレクトリはここにあります。
(2) フレームワークディレクトリ
このディレクトリはフレームワークの中核であり、db ディレクトリにはデータベース操作関数ライブラリが含まれています。 function.php ファイルが function ディレクトリに配置されています。このファイルの主な機能は、M (「do」) モードでの各レイヤーでのメソッド呼び出しの迅速なインスタンス化を容易にすることです。 libs ディレクトリには、データベース操作クラスやビュー操作クラスなどのフレームワークのコア ファクトリ クラス ファイルが配置され、外部ファイルが DB::funtion() などの方法でメソッドを呼び出すことが容易になります。 View は Smarty View エンジンを配置します。 include.list.php は、フレームワークを呼び出すときにインクルードする必要があるファイルです。これらはすべて配列に保存されます。 PC.php はフレームワーク起動エンジンであり、各モジュールの統合初期化と URL の解析を担当します。
(3) img ディレクトリ
はスタイル ファイル、js ファイル、その他の関連リソース ファイルを配置するために使用されます
(4) libs ディレクトリ
このディレクトリの名前はフレームワークの libs ディレクトリと同じですが、次のことがわかります。このディレクトリの下には、MVC の 3 層の対応する業務処理コンテンツと組織拡張ディレクトリが配置されます。Controller はコントローラーを配置し、Model はモデルを配置し、View はビュー処理クラスを配置します。
(5) tpl ディレクトリ
このディレクトリには、フロントエンド表示用のいくつかのテンプレート ファイルが配置されており、フロントエンドとバックエンドにそれぞれテンプレート ファイルを保存するための 2 つのディレクトリが配置されていることがわかります。
(6) admin.phpとindex.php
通常、MVCアーキテクチャを使用する場合はシングルエントリモードが使用され、この2つのファイルがフレームワークを起動するためのシングルエントリモードのエントリファイルとなります。
(7) config.php
基本的にすべてのフレームワークにはこの設定ファイルがあり、データベース設定、Smarty エンジン設定、いくつかの静的変数の定義などが含まれます。
これらの構造はすべてマイクロフレームワークの基本構造にすぎません。実際、複雑なフレームワークには多くの拡張機能や外部プラグインがあり、このディレクトリ構造に対応する調整を行うことができます。
3. フレームワークのポイント
(1) コントローラーの動的呼び出し
シングルエントリーモードでの通常の URL は、get メソッドでコントローラーとメソッド名を取得した後、おそらく Index.php?controller=controller&method=method に似ています。動的初期化は次の方法で実行できます
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) ネイティブメソッド変換
smartyに詳しい人は、smartyにはassignとdisplayという2つのメソッドがあり、変数を登録したりテンプレートに変数を出力したりするのに使用されることを知っているはずです。複数の変数を登録するとコードが非常に煩雑になるため、これら 2 つのメソッドを変換しようとします
public static function assign($data){ foreach ($data as $key => $value) { self::$view->assign($key,$value); } } public static function display($template){ self::$view->display($template); }
配列を直接登録できるように assign メソッドを書き換え、後続のコードの量を削減します。他の外部ライブラリを導入したい場合は、このメソッドを使用してネイティブ関数を変換し、より適用しやすくすることもできます。
(3) ロジックを含むファイル
このフレームワークの起動ファイルは pc.php です。 したがって、pc.php を含めることで、基本的にフレームワーク全体に必要なファイルが含まれます。 まず、エントリーファイル、index.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)
これは非常に簡単です。これには、pc.php エンジンを開始するための構成ファイルとフレームワークが含まれており、次に run メソッドを呼び出してフレームワークを開始します。次に、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); } }
含まれるすべてのファイルを走査します。 include.list.php ファイルに追加し、コントローラーと対応するメソッドを C クラスに渡して自動的に含めます。 include.list.php に何が含まれているかをもう一度見てください
$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. まとめ
フレームワークの基本設計はこんな感じですが、基本的にはmvcアーキテクチャを実装していますが、書き直すことでより深く理解できるようになります。さらに、今日では、このシングルエントリー MVC アーキテクチャを採用する Web サイトが増えるほど、そのような Web サイトを浸透させるためには、より適切な理解が必要になります。
その他の PHP マイクロフレームワーク設計関連記事については、PHP 中国語 Web サイトに注目してください。