怎麼一步步編寫簡單的PHP的Framework(三)

      睡不着,繼續寫一篇吧!! php

       按照上一次我講的內容,一個基本的MVC構架是已經搭建起來了的,可是自己還存在不少問題,如:模型這一起每次鏈接DB,關閉DB的代碼冗餘,視圖這一起仍是PHP代碼,每一個文件要使用不少include代碼等等。 瀏覽器

        要編寫一個框架,那麼首先就要規定一個標準的目錄結構,咱們暫時把這個目錄結構定死,不容許用戶修改,這樣能夠減小代碼量,方便你們看的更明白。 安全

        因爲以前編寫了Toper,因此我準備沿用Toper的目錄結構來作演示: 框架

         Library(框架存放目錄) 網站

                Test(假設這個框架名就叫test) 插件

          UserApps (用戶的APP存放目錄) 日誌

                 Configs(配置文件存放目錄) code

                 Modules(模塊存放目錄) blog

                          Controllers (全部控制器存放目錄) ip

                           Models (模型存放目錄)

                           Views (視圖存放目錄)

                           Helpers (輔助文件目錄)

                 Plugins(插件存放目錄,暫時用不上)

           Public (網站根目錄)

                  index.php (最重要的入口文件)

          


       這個地方有點須要解釋一下,Public目錄纔是網站的根目錄,Library目錄和UserApps目錄是存放在網站根目錄以外的,這樣用戶經過瀏覽器訪問時就不能直接訪問這個PHP文件,這樣能夠提升網站的安全性。

  以前咱們把路由的功能所有放在入口文件這一起,實際上這是不合適的,入口文件不該該作這些邏輯的處理,因此咱們把以前存放在入口文件的代碼遷移到library目錄的Test目錄下面,因爲以前在入口文件中完成的功能是路由,因此咱們把代碼遷移到Route.php,這個文件就完成路由的功能。

        好,咱們來看看Route.php這個文件的內容:



<?php
class Route {
	public static function run() {
		$controller = empty($_GET['c']) ? 'Index' : trim($_GET['c']); //設置了默認的控制器
		$action = empty($_GET['a']) ? 'index' : trim($_GET['a']); //設置了默認的Action
		$controllerBasePath = dirname(__FILE__) . '/../../UserApps/Modules/Controllers/';
		$controllerFilePath = $controllerBasePath . $controller . 'Controller.php';
		if(is_file($controllerFilePath)) {
			include $controllerFilePath;
			$controllerName = $controller . 'Controller';
			if(class_exists($controllerName)) {
				$controllerHandler = new $controllerName();
				if(method_exists($controllerHandler,$action)) {
					$controllerHandler->$action();
				} else {
					echo 'the method does not exists';
				}
			} else {
				echo 'the class does not exists';
			}
		} else {
			echo 'controller not exists';
		}
	}
}

        這個時候,看到沒,咱們只是把以前放在入口文件的代碼拷貝到Route.php這個文件中了,那麼這樣有什麼好處呢?

        入口文件代碼少了!!!


<?php
include dirname(__FILE__) . '/../Library/Test/Route.php';
Route::run();
       只有兩行的代碼,夠簡潔吧!!


       可是你看到一個問題沒有,每次我都須要使用dirname來肯定當前路徑,而若是這個框架中有20個文件,每一個文件中有3處使用dirname來獲取絕對路徑,那麼感受到恐怖了吧,90處重複代碼,若是之後路徑一修改,那將會是你的噩夢!!

        因此,咱們不妨在入口文件定義一個路徑,這個路徑做爲APP的基路徑,因爲咱們常常也會使用Library下面的Test目錄路徑,咱們也設置一個框架路徑,因此,入口文件修改成:

   

<?php
defined('APP_PATH') || define('APP_PATH',dirname(__FILE__) . '/..');
defined('FRAMEWORK_PATH') || define('FRAMEWORK_PATH',APP_PATH . '/Library/Test');
include FRAMEWORK_PATH . '/Route.php';
Route::run();
      那麼Route.php相應的也須要修改:


       

<?php
class Route {
	public static function run() {
		$controller = empty($_GET['c']) ? 'Index' : trim($_GET['c']); //設置了默認的控制器
		$action = empty($_GET['a']) ? 'index' : trim($_GET['a']); //設置了默認的Action
		$controllerBasePath = APP_PATH . '/UserApps/Modules/Controllers/';
		$controllerFilePath = $controllerBasePath . $controller . 'Controller.php';
		if(is_file($controllerFilePath)) {
			include $controllerFilePath;
			$controllerName = $controller . 'Controller';
			if(class_exists($controllerName)) {
				$controllerHandler = new $controllerName();
				if(method_exists($controllerHandler,$action)) {
					$controllerHandler->$action();
				} else {
					echo 'the method does not exists';
				}
			} else {
				echo 'the class does not exists';
			}
		} else {
			echo 'controller not exists';
		}
	}
}
      如今看這個代碼是否是要好多了!!! 


       可是經過MVC來構建應用的時候,常常會一個文件include不少類,那麼是否框架能夠實現自動導入類,而不採用手動include呢,請繼續關注個人日誌!!

        本次代碼點此下載

相關文章
相關標籤/搜索