成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何用PHP實現(xiàn)簡易的MVC框架

這篇文章主要介紹了如何用PHP實現(xiàn)簡易的MVC框架的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇如何用PHP實現(xiàn)簡易的MVC框架文章都會有所收獲,下面我們一起來看看吧。

成都創(chuàng)新互聯(lián)公司專注于金秀網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供金秀營銷型網(wǎng)站建設,金秀網(wǎng)站制作、金秀網(wǎng)頁設計、金秀網(wǎng)站官網(wǎng)定制、微信小程序服務,打造金秀網(wǎng)絡公司原創(chuàng)品牌,更為您提供金秀網(wǎng)站排名全網(wǎng)營銷落地服務。

如何用PHP實現(xiàn)簡易的MVC框架

一、前言

MVC的全名是Model View Controller,是一種使用模型-視圖-控制器設計和創(chuàng)建web應用程序的模式,是一種設計典范。

其中:

  • Model(模型):是應用程序中用于處理應用程序數(shù)據(jù)邏輯的部分,通常負責與數(shù)據(jù)庫直接進行 curd 的交互。

  • View(視圖):是應用程序處理數(shù)據(jù)顯示的部分,通過將處理好的數(shù)據(jù)進行渲染。

  • Controller(控制器):是應用程序中處理用戶交互的部分,通常用于處理數(shù)據(jù)邏輯的分發(fā),并相應的反送給視圖和控制器。

優(yōu)點:

  • 低耦合

  • 重用性高

  • 部署快,生命周期成本低

  • 可維護性高

缺點:

  • 增加了系統(tǒng)結(jié)構(gòu)和實現(xiàn)的復雜性

  • 視圖與控制器間的過于緊密的連接

二、哪些框架使用到了mvc架構(gòu)?

目前現(xiàn)在php主流的框架都已經(jīng)用到了mvc架構(gòu),例如:

thinkPHP、Laravel、Yii 都有mvc的架構(gòu)。

三、框架結(jié)構(gòu)簡介

如何用PHP實現(xiàn)簡易的MVC框架
其中:

  • app目錄:用來存放視圖控制器模型等。

  • config目錄:用來存放框架的一些公共配置文件。

  • core目錄:用來存放一些基類文件,例如:控制器基類、模型基類、視圖基類、request請求基類、db鏈式操作基類等。

  • static目錄:用來存放一些靜態(tài)資源,例如:圖片、html視圖文件、js、cs文件等。

  • index.php:整個框架的入口文件,進行分發(fā)啟動。

四、框架實現(xiàn)第一步(解析路由)

解析路由為什么是第一步呢?

只有成功解析路由以后,訪問到了某個類中的某個方法才可以使用MVC,因為解析路由也是框架實現(xiàn)的最基礎的一部分,解析路由也少不了PHP的自動加載機制

目前的php的自動加載機制可以分為兩大機制,composer自動加載機制和手動實現(xiàn)自動加載機制,該簡易框架通過手動實現(xiàn)自動機制來完成。

4.1 寫入口文件

index.php

<?php//定義應用目錄const APP_PATH = __DIR__ . '/';
//加載框架核心文件require(APP_PATH . 'core/Core.php');
//實例化框架類并運行(new core\Core())->run();

代碼詳解:

第一步,定義了常量用來定義應用目錄,后期可能會在某個地方就會用到。
第二步,加載框架核心文件 Core.php ,主要的核心邏輯也都集中在這個文件中。
第三步,實例化該類,并調(diào)用該類的run方法。

4.2 定義Core核心類

Core.php

<?phpnamespace core;class Core{
    public function run()
    {
        spl_autoload_register(array($this, 'loadClass'));
        $this->route();
    }

    public function route()
    {
        $url = $_SERVER['REQUEST_URI'];
        $position = strpos($url, '?');
        $url = $position === false ? $url : substr($url, 0, $position);
        $url = trim($url, '/');
        if ($url)
        {
            //走URL指定控制器
            $urlArray = explode('/', $url);
            $controllerName = ucfirst($urlArray[count($urlArray)-2]);
            $actionName = $urlArray[1];
        }else{
            //走默認控制器
            $controllerName = 'Index';
            $actionName = 'index';
        }
        $versionUrlArr = explode('/',$url);
        $versionUrlArr = array_slice($versionUrlArr,0,-2);
        $versionStr = implode('\\',$versionUrlArr);
        if (empty($versionStr)){
            $versionStr = $versionStr;
        }else{
            $versionStr = $versionStr.'\\';
        }
        $controller = 'app\\controllers\\'.$versionStr. $controllerName . 'Controller';
        if (!class_exists($controller)) {
            exit($controller . '控制器不存在');
        }
        if (!method_exists($controller, $actionName)) {
            exit($actionName . '方法不存在');
        }
        $dispatch = new $controller($controllerName, $actionName);
        $dispatch->$actionName();
    }
    
    public function loadClass($className)
    {
        $className = str_replace('\\','/', $className);
        $file = $className . '.php';
        if (file_exists($file)){
            require_once $file;
        }
    }}

首先調(diào)用的是該類的 run 方法,run 方法主要負責調(diào)用運行框架所需要 的一些方法,首先注冊了自動加載方法 loadClass,其后調(diào)用了的解析路由的方法(這兒是重點,這兒實現(xiàn)了地址欄上輸入接口地址直接訪問控制器)。

注意:路由的解析規(guī)則是由我們自己來進行定義的。

代碼詳解:

第一步:注冊自動加載類,目的是為了路由解析、命名空間所使用。
第二步:調(diào)用路由解析方法,把地址欄上輸入的 域名/控制器名/方法名 給解析出來,并進行調(diào)用。

經(jīng)過一系列解析后,最終 new 類名,調(diào)用方法名,來實現(xiàn)了路由的成功解析,從而訪問了某個類下面的某個方法。

$dispatch = new $controller($controllerName, $actionName);$dispatch->$actionName();

例如,要訪問app\controllers\StudentController.php文件下的 demo 方法:

<?phpnamespace app\controllers;use core\base\Controller;class StudentController extends Controller{
    public function demo()
    {
        echo '寫代碼的光頭強';
    }}

如何用PHP實現(xiàn)簡易的MVC框架

五、框架實現(xiàn)第二步(MVC的實現(xiàn))

通過第一步已經(jīng)完成了地址欄輸入路徑訪問到某個控制器中了,下面就需要在控制器中進行 MVC 操作了。

5.1 控制器的實現(xiàn)

控制器本身是已經(jīng)實現(xiàn)的,但是我們需要去繼承一個控制器基類在里面實現(xiàn)一些操作,例如:注冊一些全局異常類、注冊一些請求類、控制器之間的互相調(diào)用等。

5.2 視圖的實現(xiàn)

視圖基類文件寫到了 core/base/View.php 文件里:

<?phpnamespace core\base;/**
 * 視圖基類
 */class View{
    protected $variables = array();
    protected $_controller;
    protected $_action;

    function __construct($controller, $action)
    {
        $this->_controller = strtolower($controller);
        $this->_action = strtolower($action);
    }

    public function assign($name, $value)
    {
        $this->variables[$name] = $value;
    }

    public function render()
    {
        try {
            extract($this->variables);
            $file = APP_PATH . 'app/views/' . $this->_controller . '/' . $this->_action . '.php';
            if (file_exists($file)){
                require_once $file;
            }else{
                require_once APP_PATH.'core/errorpage/404.html';
            }
        }catch (\Exception $e){
            echo $e->getMessage();
        }

    }}

代碼詳解:

其中,視圖功能有兩大功能。

第一大功能:傳值(assign)。

我們一般傳值都是通過

$this->assign('name','寫代碼的光頭強');$this->assign('sex','男');

這種方法進行傳值。

在框架中實現(xiàn)的方法為:

public function assign($name, $value){
   $this->variables[$name] = $value;}

很明顯的可以看出,將所有的鍵值對放到了一個數(shù)組中。

第二大功能:視圖映射(render)

實現(xiàn)代碼:

public function render(){
   extract($this->variables);
   $file = APP_PATH . 'app/views/' . $this->_controller . '/' . $this->_action . '.php';
   if (file_exists($file)){
       require_once $file;
   }else{
       require_once APP_PATH.'core/errorpage/404.html';
   }}

接收到控制器名方法名,拼接到自定義視圖解析規(guī)則地址上,直接引入即可。

5.3 模型的實現(xiàn)

實現(xiàn)模型的靈魂就是要控制器名作為表名來使用。

控制器中:

$data = ['name' => 'tom'];$model = new StudentModel();$model->addData($data);

自定義的模型中:

<?phpnamespace app\models;use core\base\Model;class StudentModel extends Model{
    protected $table = 'student';

    public function addData($data)
    {
        $this->add($data);
    }}

模型基類:

<?phpnamespace core\base;use core\db\Orm;class Model extends Orm{
    protected $table;
    public function __construct()
    {
        echo $this->table;
    }

    public function add($data){
        //處理添加邏輯
    }}

在模型基類中我們可以自定義orm來完成與數(shù)據(jù)庫的交互操作

關(guān)于“如何用PHP實現(xiàn)簡易的MVC框架”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“如何用PHP實現(xiàn)簡易的MVC框架”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:如何用PHP實現(xiàn)簡易的MVC框架
網(wǎng)頁鏈接:http://jinyejixie.com/article22/iisocc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計、網(wǎng)站改版用戶體驗、做網(wǎng)站全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
双峰县| 黄平县| 肥东县| 香格里拉县| 九龙坡区| 临汾市| 昌邑市| 太仓市| 海口市| 乌拉特前旗| 西华县| 万年县| 广德县| 大竹县| 永康市| 铜川市| 肥东县| 临沧市| 晋中市| 电白县| 聂拉木县| 万宁市| 宣威市| 通辽市| 克山县| 呼伦贝尔市| 民丰县| 嘉义市| 固安县| 昌平区| 沧源| 通化市| 南皮县| 黔西| 门源| 金昌市| 古蔺县| 綦江县| 万荣县| 德格县| 邹平县|