一、MVC的基本思路
MVC的简介
Model:模型层,简单说就是数据库
View:视图层,模版,简单说就是html+php的混编文件
Controller:控制器,将模型的数据传给合适的视图将其显示出来
运行小案例
<?php /** M: model 模型, 数据库 * V: view 视图, 模板(实质是一个html+php混编的文件) * C: controller 控制器,根据模型要求选择合适的视图将期输出*/ //model $data = [ ['id'=>1, 'name'=>'老王','age'=>30, 'email'=>'lw@php.cn'], ['id'=>2, 'name'=>'老李','age'=>35, 'email'=>'ll@php.cn'], ['id'=>3, 'name'=>'老马','age'=>40, 'email'=>'lm@php.cn'], ['id'=>4, 'name'=>'老朱','age'=>45, 'email'=>'lz@php.cn'], ['id'=>5, 'name'=>'老韩','age'=>50, 'email'=>'lh@php.cn'], ]; ?> <!-- view曾 混排 --> <!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>mvc</title> </head> <body> <table border="1" cellpadding="5" cellspacing="0" width="60%"> <caption>员工信息表</caption> <tr bgcolor="#90ee90"> <th>id</th> <th>name</th> <th>age</th> <th>email</th> </tr> <?php foreach ($data as $staff) :?> <tr align="center"> <td><?=$staff['id']?></td> <td><?=$staff['name']?></td> <td><?=$staff['age']?></td> <td><?=$staff['email']?></td> </tr> <?php endforeach;?> </table> </body> </html> <!-- MVC中的C呢: 其实C就是当前脚本mvc.php,控制器的功能就是根据模型数据的要求,选择合适的视图将它展现出来 显然不能通过一个脚本完成所有的功能,软件得分模块设计开发,但最终都是由一个个具体的类中的方法来完成操作 mvc框架的起点: 就是将用户的URL请求,转发到应用程序员的类方法上 在本例中, 就是如果将用户的url请求,映射到一个具体操作上 下面我们用实例来演示一个框架的运行原理 -->
点击 "运行实例" 按钮查看在线实例
还有一个实例,模仿框架,分别写出MVC三个文件,还有入口文件
Model:
<?php $data = [ ['id'=>1, 'name'=>'老王','age'=>30, 'email'=>'lw@php.cn'], ['id'=>2, 'name'=>'老李','age'=>35, 'email'=>'ll@php.cn'], ['id'=>3, 'name'=>'老马','age'=>40, 'email'=>'lm@php.cn'], ['id'=>4, 'name'=>'老朱','age'=>45, 'email'=>'lz@php.cn'], ['id'=>5, 'name'=>'老韩','age'=>50, 'email'=>'lh@php.cn'], ]; return $data;
View:
<table border="1" cellpadding="5" cellspacing="0" width="60%"> <caption>员工信息表</caption> <tr bgcolor="#90ee90"> <th>id</th> <th>name</th> <th>age</th> <th>email</th> </tr> <?php foreach ($data as $staff) :?> <tr align="center"> <td><?=$staff['id']?></td> <td><?=$staff['name']?></td> <td><?=$staff['age']?></td> <td><?=$staff['email']?></td> </tr> <?php endforeach;?> </table>
Controlloer:
<?php class Staff { public function show ($data) { return include __DIR__ . '/../view/show.php'; } }
入口文件:
<?php /** * Created by PhpStorm. * User: apple * Date: 2019/10/6 * Time: 8:53 PM */ //print_r($_SERVER['REQUEST_URI']); $uri = explode('/', $_SERVER['REQUEST_URI']); print_r($uri); $controller = ucfirst($uri[4]); $action = $uri[5]; require_once __DIR__ . '/model/model.php'; require_once __DIR__ . '/controller/staff.php'; echo (new $controller)->show($data);
————————————
二、composer安装与使用
composer是php的管理依赖关系的工具,简单说框架是一个台式机,里面配件都装好的一个整体。composer就是把php的一些包,像攒机的配件一样,组合起来。
三、tp51的安装与运行
执行命令: `composer create-project topthink/think tp51`
tp51是安装目录,没有的话可以自动创建,当然要提前cd到上一级目录
创建虚拟主机要把目录定位在public
四、tp51实现mvc访问
创建数据库,打开navicat,把老师给的sql文件导入
连接数据库,在config/datebase.php下设置:
// 服务器地址,MacOS/Linux: localhost 'hostname' => '127.0.0.1', // 数据库名 'database' => 'tp51', // 用户名 'username' => 'root', // 密码 'password' => 'root', // 数据库调试模式 'debug' => true,
点击 "运行实例" 按钮查看在线实例
创建控制器
通常控制器类中的方法我们称之为操作,tp框架下默认在application目录下的模块下的控制器类符合psr4的规范就会自动加载,框架默认是要访问根目录/入口文件(index.php)/index(默认控制器类)/index(默认操作)
这里为了规范和方便,在index模块下(文件夹),创建了mvc文件夹,controller目录下新建Staff类,然后创建index操作
<?php namespace app\index\controller; use think\Controller; class Staff extends Controller { // 默认操作index,显示所有员工信息 public function index() { // 1. 从模型中获取数据 // 2. 选择合适的视图输出模型数据 } }
点击 "运行实例" 按钮查看在线实例
Model层创建Staff类,一般类名同数据库的表名一致
<?php /** * Created by PhpStorm. * User: apple * Date: 2019/10/7 * Time: 1:19 AM */ namespace app\index\model; use think\Model; class Staff extends Model { }
点击 "运行实例" 按钮查看在线实例
完善controller的staff类
<?php /** * Created by PhpStorm. * User: apple * Date: 2019/10/7 * Time: 1:10 AM */ namespace app\index\controller; use think\Controller; use app\index\model\Staff as StaffModel; class Staff extends Controller { //默认操作index,显示所有员工信息 public function index () { //1、从模型中获取数据 $staffs = StaffModel::all(); //2、选择合适的视图输出模型数据 return $this->fetch('index', ['staffs'=>$staffs]); } }
点击 "运行实例" 按钮查看在线实例
view层必须建立文件夹同控制器类名相同(staff)下面建立与类里的操作(index)相同的模版(index.php)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用户信息表</title> </head> <body> {//使用模版标签} {foreach $staffs as $staff} {$staff.name}:{$staff.email}<br> {/foreach} </body> </html>
点击 "运行实例" 按钮查看在线实例
最后路由可以省去入口文件,在public下的htaccess里更改:
五、总结
更换composer的中国镜像时,系统提示要更改全局的composer.json,经查阅,只需要在composer config -g repo.packagist composer https://packagist.phpcomposer.com 在composer config后面加上-g
我猜的坑,在view下没有建里staff文件夹