本身動手寫PHP框架(一)

做者:Terry Gaophp

做爲PHP Coder的入門進階,本身動手寫一個MVC框架能夠從各方面鞏固和加深你對PHP的理解,還能瞭解一些架構方面的基礎知識。git

1. 什麼是MVC

MVC(Model-View-Controller,模型-視圖-控制器)是PHP最多見的一種開發模式。它將程序劃分爲三層。github

  • 最上面的一層,是直接面向最終用戶的"視圖層"(View)。它負責給用戶提供操做界面,是程序的外殼。安全

  • 最底下的一層,是核心的"模型層"(Model),負責檢索、組織和處理程序所需的數據或信息。微信

  • 中間的一層,就是"控制層"(Controller),它負責根據用戶從"視圖層"輸入的指令,選取"模型層"中的數據,而後根據業務邏輯對其進行相應的操做,併產生最終結果。架構

2. 起步

文件結構以下
圖片描述框架

www目錄將做爲網站的根目錄,能夠在Apache或Nginx的vhost配置中將www指定爲Document Root,將核心代碼放在根目錄之外,使得用戶沒法直接訪問到核心代碼,提升整站的安全性。網站

3. 入口

既然www是根目錄,那www下的index.php就能夠做爲整站的入口,固然,你也能夠在www下繼續寫usercenter.php、admin.php等來做爲其它模塊的入口,你只須要制定規則就好。ui

而做爲入口,因爲它能夠接收到發往它的全部數據,所以能夠按照框架制定的路由規則對數據進行分發處理。所以,在入口,須要引入初始化程序,而後進行路由分發。this

/* Nova/www/index.php */
<?php
//給目錄定義一些常量
define('ROOT_DIR', __DIR__.'/..');
define('APP_DIR', ROOT_DIR.'/Application');
define('CONFIG_DIR', ROOT_DIR.'/config');
define('FRAMEWORK_DIR', ROOT_DIR.'/Framework');
define('LOG_DIR', ROOT_DIR.'/logs');
define('WWW_DIR', __DIR__.'/');
//設置一下站點的時區
define('TIMEZONE', 'Asia/Shanghai');
ini_set('data.timezone', TIMEZONE);
//引入初始化程序
require FRAMEWORK_DIR.'/init.php';

4. 初始化程序

/* Nova/Framework/init.php */
<?php
namespace Nova\Framework;

//引入配置文件
require CONFIG_DIR . '/config.php';
引入自動加載類
require 'Autoloader.php';

//初始化自動加載
Autoloader::init();
//啓用Session
Session::start();

//啓動核心處理程序
$core = new Core;
$core->run();

初始化的過程涉及到了自動加載類及Session的處理,這兩部分咱們稍後介紹。先來講說核心處理程序,我把路由分發邏輯放在了這裏。

5. 核心處理程序

/* Nova/Framework/Core.php */
<?php
namespace Nova\Framework;

class Core
{
    public function run()
    {
        $this->setReporting();
        $this->route();
    }
    
    /**
     * 設定整站的錯誤報告等級
     */
    public function setReporting()
    {
        if (DEBUG_MODE === true) {
            error_reporting(E_ALL);
            ini_set('display_errors', 'On');
        } else {
            error_reporting(E_ALL);
            ini_set('display_errors', 'Off');
            ini_set('log_errors', 'On');
            ini_set('error_log', LOG_DIR . 'error.log');
        }
    }

    /**
     * 路由規則
     *
     * 使用$_REQUEST['act']來定位控制器的類
     * 使用$_REQUEST['st']來定位具體的方法
     */
    public function route()
    {
        //若是$_REQUEST中沒有'act',則設定默認act爲index
        if (!isset($_REQUEST['act'])) {
            $_REQUEST['act'] = 'index';
        }

        //若是$_REQUEST中沒有'st',則設定默認act爲main
        if (!isset($_REQUEST['st'])) {
            $_REQUEST['st'] = 'main';
        }
        //根據act定位控制器類
        $className = 'Nova\\Application\\Controllers\\' . $_REQUEST['act'];
        //判斷控制器類是否存在,不存在則報404
        if (!class_exists($className)) {
            header('HTTP/1.1 404 Not Found');
            die($className);
        }

        //生成目標控制器類對象
        $obj = new $className();

        //判斷方法是否存在,不存在則報404
        if (!method_exists($obj, $_REQUEST['st'])) {
            header('HTTP/1.1 404 Not Found');
            exit;
        }
        //執行目標方法
        $obj->$_REQUEST['st']();
    }
}

你能夠在Github上查看Nova項目的源代碼。

若是你有任何問題或建議,能夠掃描下方二維碼或者微信搜索[phpjiagoushier],關注個人微信公衆號[PHP架構],與我交流互動。
圖片描述

相關文章
相關標籤/搜索