自定义一款mini版的mvc框架

2018-12-07 21:21:07
239
PHP

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。


上面那句话是我在百度抄的


相信大家都接触了mvc的框架 比如 thinkphp laravel cl  这些基本上都是传统的mvc开发模式


在mvc框架中 url是怎么转发到控制器里面的呢?


我们以thinkphp为例


入口文件(index.php)->think解析url->加载指定控制器


emmmm... 反正大概就这样


我们也根据这样的思路来写一个简单版本的mvc框架 


首先 我们建立一个index.php的入口文件

image.png


mvc  WEB部署目录(或者子目录)
├─application           应用目录
├─core                  框架系统目录
├─index.php             入口文件


我们在浏览器输入

http://www.php.com/Home/index?id=30

php.com是我的本地域名


这个时候 我们打印一下 $_SERVER;


<?php 

echo "<pre>";
print_r($_SERVER);
echo "</pre>";
?>


我们看下打印数据

Array
(
    [PATH] => C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files\Git\cmd;C:\Program Files\TortoiseGit\bin;F:\myphp_www\PHPTutorial\php\php-7.2.1-nts;C:\composer;C:\Users\从小就很酷\AppData\Local\Microsoft\WindowsApps;C:\Users\从小就很酷\AppData\Local\atom\bin;C:\Users\从小就很酷\AppData\Roaming\Composer\vendor\bin
    [SYSTEMROOT] => C:\WINDOWS
    [COMSPEC] => C:\WINDOWS\system32\cmd.exe
    [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    [WINDIR] => C:\WINDOWS
    [PHP_FCGI_MAX_REQUESTS] => 1000
    [PHPRC] => F:/myphp_www/PHPTutorial/php/php-7.2.1-nts/
    [_FCGI_SHUTDOWN_EVENT_] => 2256
    [PATH_TRANSLATED] => F:\web\mvc\Home\index
    [PATH_INFO] => /Home/index
    [SCRIPT_NAME] => /index.php
    [REQUEST_URI] => /index.php/Home/index?id=30
    [QUERY_STRING] => id=30
    [REQUEST_METHOD] => GET
    [SERVER_PROTOCOL] => HTTP/1.1
    [GATEWAY_INTERFACE] => CGI/1.1
    [REMOTE_PORT] => 55218
    [SCRIPT_FILENAME] => F:/web/mvc/index.php
    [SERVER_ADMIN] => admin@php.cn
    [CONTEXT_DOCUMENT_ROOT] => F:/web/mvc
    [CONTEXT_PREFIX] => 
    [REQUEST_SCHEME] => http
    [DOCUMENT_ROOT] => F:/web/mvc
    [REMOTE_ADDR] => 127.0.0.1
    [SERVER_PORT] => 80
    [SERVER_ADDR] => 127.0.0.1
    [SERVER_NAME] => www.php.com
    [SERVER_SOFTWARE] => Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9
    [SERVER_SIGNATURE] => 
    [SystemRoot] => C:\WINDOWS
    [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.9
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_CACHE_CONTROL] => max-age=0
    [HTTP_CONNECTION] => close
    [HTTP_HOST] => www.php.com
    [FCGI_ROLE] => RESPONDER
    [PHP_SELF] => /index.php/Home/index
    [REQUEST_TIME_FLOAT] => 1544187900.5551
    [REQUEST_TIME] => 1544187900
)


我们需要用到的是 PATH_INGO

["PATH_INFO"]=>string(11) "/Home/index"


我们这个时候解析一下url 将控制器和方法解析出来

<?php 
$path_info = $_SERVER['PATH_INFO'];

//我们需要将 $path_info的第一个字符 / 去除

$param = ltrim($path_info,"/");

$request = explode('/',$param);//以/分割字符串 

//var_dump($request); //array(2) { [0]=> string(4) "Home" [1]=> string(5) "index" }

//这个时候 我们就能获取到 controller 和 action

$controller = $request[0];

//echo 'Home';

$action = $request[1];

//echo 'index';



?>


ok  我们现在能获取到 控制器 和 方法了 


我们现在去建一个控制器


image.png


我们新建一个 Home控制器


然后我们将它引入进来


require_once 'app/controller/'.$controller.'.php';


引入进来以后呢 ?


我们需要实例化该类并执行他的某个方法


有两种方式可以实现


1:直接new 

require_once 'app/controller/'.$controller.'.php';

$class = new $controller;

$class->$action();


2:使用反射

$class = new ReflectionClass($controller); // 建立 Home这个类的反射类  
$instance  = $class->newInstance(); // 相当于实例化Home 类 
$instance->$action();


然后我们看下 输出什么


image.png


说明我们的url解析转发是成功了的 


emmm。。。本章就先讲到这儿 朋友们可以先去试一试


最新评论
总共 0 条评论
还没有评论,快来抢沙发吧!