Blogger Information
Blog 35
fans 0
comment 0
visits 44110
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
MVC模式的工作原理--2019年10月31日
Victor的博客
Original
1222 people have browsed it

1、下载安装composer,并把源设置为中国区镜像或阿里云镜像。
2、根据课堂案例,练习一下mvc的实现原理

一、安装compower,下载源设置为中国区镜像或阿里云镜像

Composer 是 PHP 的一个依赖管理工具。我们可以在项目中声明所依赖的外部工具库,Composer 会自动安装这些依赖的库文件。
Composer 默认情况下不是全局安装,而是基于指定的项目的某个目录中(例如 vendor)进行安装。
Composer 需要 PHP 5.3.2+ 以上版本,且需要开启 openssl。
Composer 可运行在 Windows 、 Linux 以及 OSX 平台上。

默认情况下执行 composer 各种命令是从国外的 composer 官方镜像源获取需要安装的具体软件信息,所以在不使用代理、不***的情况下,从国内访问国外服务器的速度相对比较慢。

composer可以通过设置国内镜像来下载依赖库,以阿里云镜像为例:

阿里云镜像与 Packagist 官方实时同步,推荐使用最新的 Composer 版本。最新版本: 1.9.0下载地址: https://mirrors.aliyun.com/composer/composer.phar

设置方法如下:

usecomposer.jpg



二、练习MVC的实现原理

【1】创建如下目录结构、文件

    1. controller:控制器
             --- Home.php类文件:派发功能;

    2. model:模型(业务逻辑 or 数据库功能模块)
              ---checklogin.php:ajax登录验证模块;
              ---Show.php:模拟展示文章详情 模块;

    3. view:视图
              ---longin.html:登录页面;

    4. static:需加载的静态资源
              ---jquery类库;

    5. Autoloader.php:自动加载类文件;

    6. Router.php:路由解析类文件;

    7. index.php:入口文件;



【2】不同url的运行结果如下图:

http://www.php.com/mytest/1031mvc/index.php -->进入 登录页面:(或者直接访问http://www.php.com/mytest/1031mvc/index.php/home/login)

1denglu.jpg

http://www.php.com/mytest/1031mvc/index.php/home/index  -->登录成功进入 默认页面:

2index.jpg

http://www.php.com/mytest/1031mvc/index.php/show/details  --> 模拟文章详情页面:

3show.jpg


【3】代码实例:

实例  ----- index.php入口文件
<?php
include 'Router.php';
//通过Router类 解析地址,找到指定控制器中对于的模块方法;
Router::get();
// Router::get('abcd', function () {echo '我的abcd';});
?>
运行实例 »点击 "运行实例" 按钮查看在线实例
实例 ----- Router.php 路由解析类文件
<?php
include 'Autoloader.php';
class Router {
	public static $controller = 'Home';
	public static $action = 'login';
	//取模块名称和方法名称
	public static function getRouter() {
		$array = !empty($_SERVER['PATH_INFO']) ? explode('/', strtolower($_SERVER['PATH_INFO'])) : [null, 'Home', 'login'];
		self::$controller = ucfirst($array[1]);
		self::$action = end($array);
	}
	//根据模块名称自动加载创建类的实例,并执行对应的方法
	public static function get($url = '', $function = null) {
		self::getRouter();
		switch (self::$controller) {
		case 'Home':
			$model = 'controller';
			break;
		case 'Show':
			$model = 'model';
			break;
		default:
			$model = $url;
			break;
		}
		//针对没有模块的情况 Router::get('abcd', function () {echo '显示我的 abcd 页面';});
		if (!(empty($model)) && !(empty($function))) {
			if (gettype($function) === 'object') {
				$function();   
				return;
			} //字符串另外判断;
		}
		$model .= ('\\' . self::$controller);
		$method = self::$action;
		(new $model())->$method();
	}
}
?>
运行实例 »点击 "运行实例" 按钮查看在线实例
实例  ----- Home.php 功能派发类模块
<?php
namespace controller;
class Home {
	public function index() {
		echo '<p><span style="color:red;">Hello ! </span><strong>from Home -> index</strong><p>';
	}
	public function login() {
		require_once 'view/login.html';
	}
}
?>
运行实例 »点击 "运行实例" 按钮查看在线实例
实例  -----  login.html 登录页面
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>登录页面</title>
	<script src="static/jquery-3.4.1.min.js"></script>
	<style type="text/css" media="screen">
		form{width: 55%;position: absolute;margin: 30px auto;}
		div{margin: 10px;text-align: right;}
	</style>
</head>
<body>
	<form action="model/checkLogin.php" method="post" accept-charset="utf-8">
		<div><label>用户名:<input type="text" name="username" value=""></div>
		<div><label>密  码:<input type="password" name="pwd" value=""></label></div>
		<div><label>验证码:<input type="text" name="vericode" value=""></label></div>
		<div><button type="button" onclick="save()">提交</button></div>
	</form>
<script>
	function save(){
		var username = $.trim($('input[name="username"]').val());
		var pwd = $.trim($('input[name="pwd"]').val());
		var vericode = $.trim($('input[name="vericode"]').val());
		var result = (username=='')?(function(){alert('请输入用户名');return;})()
		              :((pwd=='')?(function(){alert('请输入密码');return;})()
		              :((vericode=='')?(function(){('请输入验证码');return;})():1;
		$.post('model/checkLogin.php',$('form').serialize(),function(data){
			alert(data.msg);
			return (data.code==0) && (function(){window.location.href = 'index.php/home/index';})();
		},'json');
	}
</script>
</body>
</html>
运行实例 »点击 "运行实例" 按钮查看在线实例
实例   ----- Show.php 类文件
<?php
namespace model;
class Show {
	public function details() {
		echo '<p><span style="color:red;">显示文章详情 ! </span><strong>from Show -> details</strong><p>';
	}
}
?>
运行实例 »点击 "运行实例" 按钮查看在线实例





【4】总结

再次练习MVC模型,诸如路径解析、相对路径和绝对路径的细节问题上还是总会出错;

项目文件没有放到网站根目录下,在路径解析和去掉index.php的url管理方面还没有完全搞清楚。











Correction status:qualified

Teacher's comments:项目跑通了, 不错
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post