構(gòu)建自己的PHP框架--搭建基本結(jié)構(gòu)
首先,我們來說一下,為什么要?jiǎng)?chuàng)建自己的框架?
為什么要?jiǎng)?chuàng)建自己的框架呢?如果你跟周圍的人討論,每個(gè)人都會告訴你重復(fù)發(fā)明輪子是一件糟糕的事情,你最好選擇一個(gè)已有的框架,忘掉“創(chuàng)建自己的框架”這種想法。大部分情況,他們是正確的,但是我想到了幾個(gè)創(chuàng)建自己的框架的好處:
- 
    
了解更多框架的底層架構(gòu)
 - 
    
創(chuàng)建一個(gè)能滿足你特殊需求的框架(但首先要確定你的需求真的是很特別)
 - 
    
因?yàn)闃啡ざ囍鴮懸粋€(gè)框架(為了“學(xué)習(xí)然后拋棄”的目的)
 - 
    
想利用新的開發(fā)技術(shù)以及最佳實(shí)踐重構(gòu)已經(jīng)存在的項(xiàng)目
 - 
    
向世界證明自己也是可以寫出框架的(......但只需那么一點(diǎn)點(diǎn)付出)
 
我將一步步的,循序漸進(jìn)的引導(dǎo)你創(chuàng)建一個(gè)框架。每一步你得到的都是一個(gè)完全能使用的框架。我們將從一個(gè)簡單的框架開始,然后一點(diǎn)點(diǎn)的給它加功能。最后,你將能得到一個(gè)完整的web框架。
上面的原因是摘來的使用Symfony2的組件創(chuàng)建自己的PHP框架,覺得說的不錯(cuò)就直接拿過來用了。
我們先建立一個(gè)目錄,然后進(jìn)入該目錄
- mkdir simple-framework
 - cd simple-framework
 
然后分別建立放置controller/model/view等的目錄
- mkdir controllers models views public
 
public用來存放統(tǒng)一的入口,在里面建立index.php,大部分框架現(xiàn)在都是單一入口。
然后我們需要支持以下composer,我們希望第三方的包都能通過composer來管理。如果你還不知道composer是什么,請查看composer。
在simple-framework文件夾下執(zhí)行 composer init,然后填寫相應(yīng)內(nèi)容,生成一個(gè)composer.json文件,其內(nèi)容大概如下:
- {
 - "name": "craryprimitiveman/simple-framework",
 - "description": "A simple php framework",
 - "license": "MIT",
 - "authors": [
 - {
 - "name": "harrysun",
 - "email": "sunguangjun@126.com"
 - }
 - ],
 - "require": {}
 - }
 
讓后修改以下,結(jié)果如下:
- {
 - "name": "craryprimitiveman/simple-framework",
 - "description": "A simple php framework",
 - "license": "MIT",
 - "authors": [
 - {
 - "name": "harrysun",
 - "email": "sunguangjun@126.com"
 - }
 - ],
 - "require": {},
 - "autoload": {
 - "psr-4": {
 - "sf\\": "src/",
 - "app\\": ""
 - }
 - },
 - "repositories": [
 - {"type": "composer", "url": "http://packagist.phpcomposer.com"},
 - {"packagist": false}
 - ]
 - }
 
其中的autoload是為了支持我們自己項(xiàng)目的文件加載,其中sf下的是framework的code,而app下的是正常業(yè)務(wù)羅輯的code, 其中的repositories是為了解決在國內(nèi)使用composer下載,下載不下來的問題,如果在國外,或者有VPN做代理,可以直接去掉。
然后執(zhí)行composer install。
這樣基本的目錄結(jié)構(gòu)就構(gòu)建好了。
在入口文件public/index.php中,引入autoload文件,如下:
- <?php
 - require_once __DIR__ . '/../vendor/autoload.php';
 
然后我們定義我們的url是這樣的http://localhost/simple-framework/public/index.php?r=site/test,之后會加相應(yīng)的nginx或apache的rewrite,是url變簡潔好看,但暫時(shí)先這樣。
這個(gè)url訪問了SiteController中的actionTest,下面我們來簡單實(shí)現(xiàn)這個(gè)功能。
- <?php
 - require_once __DIR__ . '/../vendor/autoload.php';
 - $router = $_GET['r'];
 - list($controllerName, $actionName) = explode('/', $router);
 - $ucController = ucfirst($controllerName);
 - $controllerName = 'app\\controllers\\' . $ucController . 'Controller';
 - $controller = new $controllerName();
 - return call_user_func_array([$controller, 'action'. ucfirst($actionName)];
 
上面的code未添加任何的錯(cuò)誤處理,只是一個(gè)簡單的功能實(shí)現(xiàn)。
然后在controllers文件夾中添加SiteController.php文件,內(nèi)容如下:
- <?php
 - namespace app\controllers;
 - class SiteController
 - {
 - public function actionTest()
 - {
 - echo 'success!';
 - }
 - }
 
然后訪問之前的url http://localhost/simple-framework/public/index.php?r=site/test,你會看到打印出了success!
然后我們在來寫一個(gè)actionView方法去渲染一個(gè)頁面。actionView的代碼如下:
- public function actionView()
 - {
 - $body = 'Test body information ';
 - require '../views/site/view.php';
 - }
 
我們還需要在views下面添加site文件夾,并在site文件夾下創(chuàng)建view.php文件,其內(nèi)容如下:
- <html>
 - <head>
 - <title>title</title>
 - <head>
 - <body>
 - <?php echo $body;?>
 - </body>
 - </html>
 
最后訪問http://localhost/simple-framework/public/index.php?r=site/view,會得到如下頁面:

好了,今天就先到這里。項(xiàng)目內(nèi)容和博客內(nèi)容也都會放到Github上,歡迎大家提建議。
code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.1
blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework















 
 
 









 
 
 
 