博主信息
Victor的博客
博文
32
粉丝
0
评论
0
访问量
6122
积分:0
P豆:68

MVC模式的工作原理--2019年10月31日

2019年11月03日 21:40:29阅读数:219博客 / Victor的博客 / laravel框架

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管理方面还没有完全搞清楚。











批改状态:合格

老师批语:项目跑通了, 不错

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
暂无评论暂无评论!