这篇文章主要介绍了如何用PHP实现简易的MVC框架的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何用PHP实现简易的MVC框架文章都会有所收获,下面我们一起来看看吧。
MVC的全名是Model View Controller
,是一种使用模型-视图-控制器设计和创建web应用程序的模式,是一种设计典范。
其中:
Model(模型):是应用程序中用于处理应用程序数据逻辑的部分,通常负责与数据库直接进行 curd 的交互。
View(视图):是应用程序处理数据显示的部分,通过将处理好的数据进行渲染。
Controller(控制器):是应用程序中处理用户交互的部分,通常用于处理数据逻辑的分发,并相应的反送给视图和控制器。
优点:
低耦合
重用性高
部署快,生命周期成本低
可维护性高
缺点:
增加了系统结构和实现的复杂性
视图与控制器间的过于紧密的连接
目前现在php主流的框架都已经用到了mvc架构,例如:
thinkPHP
、Laravel
、Yii
都有mvc的架构。
其中:
app目录:用来存放视图控制器模型等。
config目录:用来存放框架的一些公共配置文件。
core目录:用来存放一些基类文件,例如:控制器基类、模型基类、视图基类、request请求基类、db链式操作基类等。
static目录:用来存放一些静态资源,例如:图片、html视图文件、js、cs文件等。
index.php:整个框架的入口文件,进行分发启动。
解析路由为什么是第一步呢?
只有成功解析路由以后,访问到了某个类中的某个方法才可以使用MVC,因为解析路由也是框架实现的最基础的一部分,解析路由也少不了PHP的自动加载机制
目前的php的自动加载机制可以分为两大机制,composer自动加载机制和手动实现自动加载机制,该简易框架通过手动实现自动机制来完成。
index.php
:
<?php//定义应用目录const APP_PATH = __DIR__ . '/';
//加载框架核心文件require(APP_PATH . 'core/Core.php');
//实例化框架类并运行(new core\Core())->run();
代码详解:
第一步,定义了常量用来定义应用目录,后期可能会在某个地方就会用到。
第二步,加载框架核心文件 Core.php
,主要的核心逻辑也都集中在这个文件中。
第三步,实例化该类,并调用该类的run
方法。
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;
}
}}
首先调用的是该类的 run
方法,run
方法主要负责调用运行框架所需要 的一些方法,首先注册了自动加载方法 loadClass
,其后调用了的解析路由的方法(这儿是重点,这儿实现了地址栏上输入接口地址直接访问控制器)。
注意:路由的解析规则是由我们自己来进行定义的。
代码详解:
第一步:注册自动加载类,目的是为了路由解析、命名空间所使用。
第二步:调用路由解析方法,把地址栏上输入的 域名/控制器名/方法名
给解析出来,并进行调用。
经过一系列解析后,最终 new 类名,调用方法名,来实现了路由的成功解析,从而访问了某个类下面的某个方法。
$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 '写代码的光头强';
}}
通过第一步已经完成了地址栏输入路径访问到某个控制器中了,下面就需要在控制器中进行 MVC 操作了。
控制器本身是已经实现的,但是我们需要去继承一个控制器基类在里面实现一些操作,例如:注册一些全局异常类、注册一些请求类、控制器之间的互相调用等。
视图基类文件写到了 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','男');
这种方法进行传值。
在框架中实现的方法为:
public function assign($name, $value){
$this->variables[$name] = $value;}
很明显的可以看出,将所有的键值对放到了一个数组中。
第二大功能:视图映射(render)
实现代码:
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';
}}
接收到控制器名方法名,拼接到自定义视图解析规则地址上,直接引入即可。
实现模型的灵魂就是要控制器名作为表名来使用。
控制器中:
$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来完成与数据库的交互操作
关于“如何用PHP实现简易的MVC框架”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“如何用PHP实现简易的MVC框架”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。