最近正在开发一个PHP的开发框架(ibframework),所以把开发过程中的一些技术细节做一下分享,让你可以轻松编写自己的专属框架(很久没写文章了,为了大V,无奈啊)。
目前框架还正在开发中,参考原型是(YII/CI/Brophp等开源框架),代码我都会及时同步到github,代码还有很多的不足之处,希望能跟各位PHP爱好者多多交流。托管地址:https://github.com/xstudio/ibframework
今天主要简单阐述一个Framework的主入口文件(index.php)和MVC模式的实现。
一般一个框架的主入口文件是网站根目录的index.php,用户每次都要访问的。这样在index.php中就可以根据用户请求参数实例化不同的控制器类。例如一个简单的网站目录结构。
1 2 3 4 | │ index.php ├───controllers/ ├───models/ └───views/ |
包含一个主入口文件index.php,基本的MVC结构(models/controllers/views)。
主入口文件中,我们只需要处理一下用户提交的参数,假如用c代表应该实例化的控制器类,a代表应该执行控制器中的action。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //default controller IndexController if not exists $_GET['c'] $c =isset( $_GET [ 'c' ])? $_GET [ 'c' ]: 'index' ; //controller file $controller_src =dirname( __FILE__ ). '/controllers/' .ucfirst( $c ). 'Controller.php' ; //echo $controller_src; if ( file_exists ( $controller_src )) { include ( $controller_src ); $class_name =ucfirst( $c ). 'Controller' ; //instantiate controller class $controller = new $class_name ; if (isset( $_GET [ 'a' ]) && !emptyempty( $_GET [ 'a' ])) $action = $_GET [ 'a' ]; //execute action if (method_exists( $controller , $action )) $controller -> $action (); else echo 'Error Action:' . $action ; } else echo 'Unknown Controller:' . $c ; |
这样我们就可以在models目录下编写一个TestModel.php的模型文件,打印一个helloworld,一会会在控制器中实例化这个model类。
1 2 3 4 5 6 7 | class TestModel { public function printHelloWorld() { return 'Hello World!!' ; } } |
接着在views目录下编写一个test.php的视图文件,用于显示一会控制器要分配过来的变量$str
1 | <h1>从控制器中分配过来的变量的值为:<?php echo $str ?></h1> |
最后在controllers目录下编写一个控制器类TestController.php,实例化model类,并且分配views。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class TestController { public function helloworld() { include (dirname( __FILE__ ). '/../models/TestModel.php' ); $model = new TestModel; $this ->render( 'test.php' , array ( 'str' => $model ->printHelloWorld())); } /** * render templet file and send content to browser * @param string $tpl templet filename * @param array $assign assigned variable parameter=>value */ private function render( $tpl =null, $assign = array ()) { $tpl_file =dirname( __FILE__ ). '/../views/' . $tpl ; if ( file_exists ( $tpl_file )) { //make str to variable if (!emptyempty( $assign )) extract( $assign , EXTR_PREFIX_SAME, 'assign' ); include ( $tpl_file ); } } } |
现在就可以打开浏览器访问http://localhost/index.php?c=test&a=helloworld,我们可以看到页面输出。
注:本文旨在简单阐述mvc的实现原理,所以一切都是基于简单。例如一个完整的框架中会有一个Controller的父类,这样子类集成后就可以调用父类的render方法分配视图了。还有models中的类文件一般会预先加载好或者写到__autoload中,不用再在控制器中包含;为防止不同控制器的视图文件重名,一般会在views目录建一个跟控制器重名的文件夹作区分;框架会有一个单独的文件夹,包含系统的核心类等等。这里都不再赘述,有兴趣的朋友可以学习一下一些开源的框架用法。
- 正在加载用户留言,请稍后~