小笙's Blog

PHP框架DIY[主入口文件及MVC的实现] 2013.12.30 17:54

最近正在开发一个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目录建一个跟控制器重名的文件夹作区分;框架会有一个单独的文件夹,包含系统的核心类等等。这里都不再赘述,有兴趣的朋友可以学习一下一些开源的框架用法。

  • 正在加载用户留言,请稍后~
点击这里取消回复

  • 请选择邮箱类型
  • @qq.com
  • @163.com
  • @sina.com
  • @126.com
  • @vip.qq.com
  • @sina.com.cn

:love: :kiss: :twist: :top: :shake: :bye: :han: :sleep: :lula: :rou: :happy: