PHP学習メモ、MVCフレームワークを自分で書く

WBOY
リリース: 2016-06-23 14:37:21
オリジナル
888 人が閲覧しました

最近、自分のブログを始める過程で、さまざまなオープンソースのブログシステムが多かれ少なかれ使いにくいことに気づきました。そこで、自分でブログシステムを書いてみたいと思いました。まず、MVC フレームワークをステップバイステップで作成します。作成プロセス中にたくさんのアイデアがあるので、最初にこのシステムについての私の考えをここに記録しておきます。 1. 二次開発が可能なモジュール型ブログシステムを実装したい

2. mongodb を含むリライト機能を実装したい。 mysql と mysqli です。

4、smarty を使いたいです。

さて、まず、システムを設計する必要があります (PHPCMS を参照)。

/

./log -- これはログディレクトリです。

./system --- これはシステムディレクトリです

./lib -- これはシステムライブラリです。主要なものはここに置かれます

./classes -- これはシステムの関連クラスです

./configs -- これはシステムの設定ファイルディレクトリです

./model -- これは各データモデルのディレクトリです

./modules -- これは各モジュールのディレクトリです

./base.php -- すべてのリクエストがこのファイルにルーティングされ、このファイルが配布されます

./index -- モジュールとしてインデックスを書き込みます

./templates--これはテンプレートディレクトリです

./default--これはデフォルトのテンプレートディレクトリです

./cache--これはキャッシュディレクトリです

index.php------- -- --これは、関連するリクエストをルーティングするために使用される単一エントリのファイルです。

MVC フレームワークはモデル、Ctrl、ビューを分離する必要があります。その後、疑似静的などについて説明します。最も基本的な要件を最初に満たす必要があります

MVC フレームワークには 1 つのエントリ ファイルが必要なので、最初のファイルはルート ディレクトリに生成されます。これは、すべてのリクエストを受信するために使用されます。リクエストはここからです。 単一の入り口の利点については、自分で検索してブレインストーミングしてください

私の理解によれば、各データモデルは 1 つ以上のテーブルに対応する必要があります。記事テーブル、記事テーブル、コメントテーブルに個別に対応できます

データモデルに関しては、扱いません。最初にデータベースを使用して、URL をルーティングできるようにする必要があります

最も単純な URL http:// は、index.php ファイル内のインデックス コントローラーにルーティングする必要があります。 Index モジュールを作成し、このコントローラーのデフォルトのメソッドを実行します (init に設定しました)。

デフォルトのルーティング パラメーターがあるため、それを作成しました。ファイルは、default_arg.config.php という名前で、/system/lib/configs/ に保存されます。デフォルトのパラメータを返すために使用されます

中の内容はおそらく次のようになります:

<?php	return array(		  'default' =>		   array(				'm'=>'index',				'c'=>'index',				'a'=>'init',				),		  );
ログイン後にコピー

引用したいとき これらを設定するときは、次の

$configs = include_once($file);
ログイン後にコピー

を呼び出すだけです。この大きな配列を構成に割り当てるには、デフォルトのパラメータを URL に接続します。これは

http://domain name.com/index.php?m= になります。 Index&c=index&a=init

これらの関数はすべてどのように実装されていますか?

index.php にアクセスしているので、index .php から開始します。実際、インデックスには数行しかありません、

define('ROOT_PATH',dirname(__FILE__));//定义一个系统路径require_once(ROOT_PATH.DIRECTORY_SEPARATOR.'system'.DIRECTORY_SEPARATOR.'base.php');//引用框架的基础类$sys = base::getInstance();//得到基础类的实例,基础类是一个单例类$sys->init();//调用单例类的init方法
ログイン後にコピー

In実際、DIRECTORY_SEPARATOR は / であるため、フレームワーク内のベース ファイルを参照し、最後に init メソッドを呼び出します。ここでシングルトン クラスを使用する方が科学的です。後でクラス全体を投稿します

内部の getInstance が何をするのかをもう一度見てみましょう。 ?

class base{	public static $sys;	private function __construct(){		return false;	}	public static function getInstance(){		if(!(self::$sys instanceof self)){			self::$sys = new self();		}		return self::$sys;	}
ログイン後にコピー

シングルトンクラスなので、newキーワードで外部からクラスが新しくなることを防ぐためです。このクラスを外部から新規にすることはできません

まず、$sys 変数が独自のインスタンスであるかどうかを確認してください。そうでない場合は、独自のインスタンスを $sys に割り当てます。したがって、操作は実行されず、最終的にこのクラスのインスタンスが返されます

init メソッドが何をするのか見てみましょう

	public static function init(){		self::sys_class('model');		self::sys_class('ctrl');		$args = self::__explan_arg();		$ctrl = self::__load_ctrl($args['m'],$args['c']);		call_user_func(array($ctrl,$args['a']));	}
ログイン後にコピー

この基本クラスには、メソッド名の前にアンダースコアが 2 つあります。指定されたディレクトリにシステムをロードする sys_class があり、このディレクトリにはモデルの基本クラスとコントロールであるモデル クラスと Ctrl クラスがロードされます。 class. コントローラー クラスの基本クラス。この Ctrl クラスは、すべてのコントローラーの基本クラスです。たとえば、クラス内に基本インスタンスを含めることができます。すべてのコントローラーを統合します。このモデル クラスはまだ使用されていません。これについては後で説明します。

  然后我调用了__explan_arg方法.这个方法就是来解析get得到的参数的.

	private static function __explan_arg(){		$default_arg = self::sys_config('default_arg');		$args['m'] = isset($_GET['m'])?$_GET['m']:$default_arg['m'];		$args['c'] = isset($_GET['c'])?$_GET['c']:$default_arg['c'];		$args['a'] = isset($_GET['a'])?$_GET['a']:$default_arg['a'];		return $args;	}
ログイン後にコピー

  我在第一行使用了一个sys_config方法来加载默认参数.这个方法就是在系统的/system/lib/configs/目录下面找到对应的配置文件,上面已经说过了怎么把数组返回.这样当GET里面没有相应的参数的时候就会使用默认的参数.接下来我们调用了__load_ctrl方法加载了相应的控制器.传入了m和c.这个方法实现的就是到m所指定的目录下面找到c这个文件并且实例化一个c这个类(也就是相应的控制器类.)并且返回相应控制器类的实例.然后我调用了一个call_user_func方法.因为我们没办法在程序里像下面的样子来调用控制器的方法

$ctrl->$args['a'];//这样是没办法调用的
ログイン後にコピー

 所以我们使用了call_user_func方法来调用相应控制器的方法.

好了,现在再缕缕我们程序的流程.首先访问了index.php-->index.php定义了一个路径,去引用了base类.并且得到了一个base类的实例.还调用了base的init方法.-->base的init方法做了下面的事情-->先去引用了基类model和ctrl-->去解析了url中的参数,得到了m,c,a-->通过m,c来引用相应的控制器,-->调用相应控制器的a方法.然后就会得到相应的输出了.

  到此为止我们的框架控制器部分基本算是完成了,默认的args是index,index,init.我们在/modules/index/里面建立一个index.php文件.里面写如下的内容.

<?phpclass c_index extends ctrl{	public function __construct(){		parent::__construct();	}	public function init(){		echo "hello my mvc!";	}}
ログイン後にコピー

  再来访问我们的根域名,那么我们就会得到hello my mvc.这句话的输出.

 

 

----------------------------------------------------------------------------------------------------------------------------------

毕竟是自己个人的思路.如果有什么不妥的地方,欢迎大家拍砖,也希望大家能够一起来参与讨论,最近看到php的相关板块不像以前那么火了.还希望大家能够多多来参与发帖和讨论.

 

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート