构建自己的PHP框架--搭建基本结构

开发 后端
为什么要创建自己的框架呢?如果你跟周围的人讨论,每个人都会告诉你重复发明轮子是一件糟糕的事情,你最好选择一个已有的框架,忘掉“创建自己的框架”这种想法。大部分情况,他们是正确的,但是我想到了几个创建自己的框架的好处:

首先,我们来说一下,为什么要创建自己的框架?

为什么要创建自己的框架呢?如果你跟周围的人讨论,每个人都会告诉你重复发明轮子是一件糟糕的事情,你最好选择一个已有的框架,忘掉“创建自己的框架”这种想法。大部分情况,他们是正确的,但是我想到了几个创建自己的框架的好处:

  • 了解更多框架的底层架构

  • 创建一个能满足你特殊需求的框架(但首先要确定你的需求真的是很特别)

  • 因为乐趣而试着写一个框架(为了“学习然后抛弃”的目的)

  • 想利用新的开发技术以及最佳实践重构已经存在的项目

  • 向世界证明自己也是可以写出框架的(......但只需那么一点点付出)

我将一步步的,循序渐进的引导你创建一个框架。每一步你得到的都是一个完全能使用的框架。我们将从一个简单的框架开始,然后一点点的给它加功能。最后,你将能得到一个完整的web框架。

上面的原因是摘来的使用Symfony2的组件创建自己的PHP框架,觉得说的不错就直接拿过来用了。

我们先建立一个目录,然后进入该目录

 

  1. mkdir simple-framework 
  2. cd simple-framework 

然后分别建立放置controller/model/view等的目录

  1. mkdir controllers models views public 

public用来存放统一的入口,在里面建立index.php,大部分框架现在都是单一入口。

然后我们需要支持以下composer,我们希望第三方的包都能通过composer来管理。如果你还不知道composer是什么,请查看composer

在simple-framework文件夹下执行 composer init,然后填写相应内容,生成一个composer.json文件,其内容大概如下:

 

  1.     "name""craryprimitiveman/simple-framework"
  2.     "description""A simple php framework"
  3.     "license""MIT"
  4.     "authors": [ 
  5.         { 
  6.             "name""harrysun"
  7.             "email""sunguangjun@126.com" 
  8.         } 
  9.     ], 
  10.     "require": {} 

 

让后修改以下,结果如下:

 

  1.     "name""craryprimitiveman/simple-framework"
  2.     "description""A simple php framework"
  3.     "license""MIT"
  4.     "authors": [ 
  5.         { 
  6.             "name""harrysun"
  7.             "email""sunguangjun@126.com" 
  8.         } 
  9.     ], 
  10.     "require": {}, 
  11.     "autoload": { 
  12.         "psr-4": { 
  13.             "sf\\": "src/", 
  14.             "app\\": "
  15.         } 
  16.     }, 
  17.     "repositories": [ 
  18.         {"type""composer""url""http://packagist.phpcomposer.com"}, 
  19.         {"packagist"false
  20.     ] 

 

其中的autoload是为了支持我们自己项目的文件加载,其中sf下的是framework的code,而app下的是正常业务罗辑的code, 其中的repositories是为了解决在国内使用composer下载,下载不下来的问题,如果在国外,或者有VPN做代理,可以直接去掉。

然后执行composer install。

这样基本的目录结构就构建好了。

在入口文件public/index.php中,引入autoload文件,如下:

 

  1. <?php 
  2. require_once __DIR__ . '/../vendor/autoload.php'

然后我们定义我们的url是这样的http://localhost/simple-framework/public/index.php?r=site/test,之后会加相应的nginx或apache的rewrite,是url变简洁好看,但暂时先这样。

这个url访问了SiteController中的actionTest,下面我们来简单实现这个功能。

 

  1. <?php 
  2. require_once __DIR__ . '/../vendor/autoload.php'
  3.  
  4. $router = $_GET['r']; 
  5. list($controllerName, $actionName) = explode('/', $router); 
  6. $ucController = ucfirst($controllerName); 
  7. $controllerName = 'app\\controllers\\' . $ucController . 'Controller'; 
  8. $controller = new $controllerName(); 
  9. return call_user_func_array([$controller, 'action'. ucfirst($actionName)]; 

 

上面的code未添加任何的错误处理,只是一个简单的功能实现。

然后在controllers文件夹中添加SiteController.php文件,内容如下:

 

  1. <?php 
  2. namespace app\controllers; 
  3.  
  4. class SiteController 
  5.     public function actionTest() 
  6.     { 
  7.         echo 'success!'
  8.     } 

 

然后访问之前的url http://localhost/simple-framework/public/index.php?r=site/test,你会看到打印出了success!

然后我们在来写一个actionView方法去渲染一个页面。actionView的代码如下:

 

  1. public function actionView() 
  2.     $body = 'Test body information   '
  3.     require '../views/site/view.php'

我们还需要在views下面添加site文件夹,并在site文件夹下创建view.php文件,其内容如下:

 

  1. <html> 
  2.     <head> 
  3.         <title>title</title> 
  4.     <head> 
  5.     <body> 
  6.         <?php echo $body;?> 
  7.     </body> 
  8. </html> 

 

最后访问http://localhost/simple-framework/public/index.php?r=site/view,会得到如下页面:

好了,今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。

code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.1

blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework

责任编辑:王雪燕 来源: 博客园
相关推荐

2017-05-08 14:27:49

PHP框架函数框架

2009-12-09 10:34:54

PHP基本语法结构

2020-09-01 13:10:42

JavaScript开发 技巧

2010-03-25 15:52:51

Python程序

2011-07-05 17:45:07

PHP框架

2021-08-09 20:30:17

开源框架页面

2021-07-25 21:28:55

人脸识别人工智能工具

2010-06-01 15:00:00

SVN仓库

2014-08-26 10:05:37

框架开发AngularJS

2017-02-05 09:13:58

PHP Cake框架构建

2015-10-26 13:41:41

Aleax查询服务

2021-04-23 09:40:17

Vue插件框架

2016-09-18 10:08:38

Linux发行版SUSE Studio

2012-11-13 11:29:51

Ubuntu

2013-11-20 09:26:21

AngularJSJavaScript

2023-07-30 17:34:53

KV存储ChunkPosit

2014-07-30 09:35:36

DockerPaaS

2011-09-09 10:49:18

2009-06-25 14:51:15

开源PHP框架

2016-06-14 09:48:19

框架
点赞
收藏

51CTO技术栈公众号