制作自己的MVC框架(一)——簡單粗暴的實現


現在市面上有很多成熟的MVC框架,可以拿來直接用,但自己造一下輪子其實也挺有意思的。

下面先來看個最簡單粗暴的MVC實現。

5個文件就能實現最簡單的MVC,在Apache中設置一個虛擬目錄,配置個簡單域名,就可以順利訪問了。

為了實現簡單,這里沒有寫模型層。

 

一、index.php

這個文件是入口文件,所有的請求就將會先進入到這個文件,然后再通過路由進入到不同的控制器中。

這就是常說的單一入口

1. 我簡單的將路由也放在了這個文件中。

2. 還將一個簡單的全局常量放在了這里。

define('APP_PATH', dirname(__FILE__));

//路由邏輯
if(empty($_GET['c'])) {
    $uri = ltrim($_SERVER['REQUEST_URI'],'/');
    $params = explode('/',$uri);//簡單粗暴的將URL分割,例如index/action
    $controller = $params[0];//第一個變量是控制器名
    $action = $params[1];//第二個是方法名
}else {
    $controller = $_GET['c'];//第二種域名訪問方式 "pwstrick.com?c=index&a=action"
    $action = $_GET['a'];
}

3. 再是引入試圖的生成類和控制器類

4. 最終初始化這個控制器,就能實現訪問了。

//初始化邏輯
require_once './view.php';//試圖控制類
require_once APP_PATH . '/controller/'.$controller.'.php';//需要訪問的控制器,例如index控制器
$handler = new $controller;//初始化這個控制器,例如index
$handler->$action();//執行方法,也就是最終訪問的那個地方

這樣就完成了一次簡單的訪問,下圖就是輸入了一個簡單URL,展示了view中的內容。

 

二、.htaccess

.htaccess”是做路由用的,因為我用的服務器軟件是Apache,所以需要,如果是Nginx就不需要。

這里將URL中的“index.php”干掉了,不然訪問就需要多打這個,例如“index.php?c=index&a=action”。

這些參數具體的用法,可以上網自己查一下的。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [L]

 

三、視圖

市面上有很多模版引擎,很多都需要些學習成本。這里我用了PHP自帶的Output Control相關函數。

下面的代碼是“view.php”中的方法。

public function fetch($template, array $data = []) {
        $data = array_merge($this->attributes, $data);
        ob_start();
        extract($data);//設置view上面的參數
        include $this->templatePath . $template;//引入試圖文件的絕對路徑
        $output = ob_get_clean();//輸出頁面
        return $output;
}

下面的代碼是“view/index.php”中的代碼,就僅僅是輸出一個變量“$send”而已。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>badge</title>
</head>
<body>
    <strong><?php echo $send?></strong>
</body>
</html>

 

四、控制器

控制器在入口文件“index.php”中初始化了一下,並且也引用了一下指定的方法。

里面也沒有使用到什么高大上的方法,就是在執行生成view的代碼。

//一般都會繼承一個通用的controller父類
class index {
    function action() {
        $view = new view(APP_PATH . '/view/');//初始化視圖控制類
        $output = $view->fetch( 'index.php',array('send' => '發送'));//指定要輸出的視圖名,並設置變量
        echo $output;
    }
}

 

這樣就實現了一次簡單MVC。

接下來會具體的做些邏輯的分層,添加一些通用的功能,路由,引入數據操作,配置文件等。

 

demo下載:

https://github.com/pwstrick/framework_demo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM