IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> [php]-MVC -> 正文阅读

[PHP知识库][php]-MVC


MVC介绍

img

MVC(Model View Controller)是软件工程中的一种软件架构模式,它把软件系统分为模型、视图控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

M:Model,模型
	完成具体的业务操作,如:查询数据库,封装对象
	
V:view视图。JSP、HTML等来进行数据展示

C:Controller控制器。 Servlet
	获取View的请求
	调用模型将数据交给视图进行展示

MVC结构

目录

|——app:	应用目录(多模块)
	|——单模块:	即一个主界面,其中包含Model、View、Controller
	|——多模块:	即一个主界面,其中包含Model、View、Controller
|——config:	配置文件目录
|——pro:	核心目录文件
|——public:	WEB目录文件

url访问控制器

先在public下创建index.php

请添加图片描述

然后访问

http://127.0.0.1:3678/public/index.php/

在这里插入图片描述

可以访问得到

如果访问 app/index.php 可以直接修改url地址 , 所以我们切换目录文件

在网站根目录下添加 public 目录

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xzYFX2e5-1663725854163)(C:\Users\muz11\AppData\Roaming\Typora\typora-user-images\image-20220918110815849.png)]

访问 /app/ 就会报错了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0cnrb8vD-1663725854164)(C:\Users\muz11\AppData\Roaming\Typora\typora-user-images\image-20220918110844300.png)]

app 下写个控制器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTysnYjE-1663725854165)(C:\Users\muz11\AppData\Roaming\Typora\typora-user-images\image-20220919195724039.png)]

在这里插入图片描述

然后访问控制器里面的方法

http://127.0.0.1:3678/index.php/index/home/index?id=123&titile=456

在这里插入图片描述

我们可以找到这些东西

[SCRIPT_NAME] => /index.php 
[REQUEST_URI] => /index.php/index/home/index?id=123&titile=456 
[QUERY_STRING] => id=123&titile=456
// /public/index.php
$script_name=$_SERVER['SCRIPT_NAME'];  

// /public/index.php/index/home/index?id=123&titile=456
$request_url=$_SERVER['REQUEST_URI'];  

// id=123&titile=456
$query_string=$_SERVER['QUERY_STRING']; 

然后提取我们想要的部分 /index/home/index?

...
$url = str_replace($script_name, '' ,$request_url);
$url = str_replace($query_string,'',$url);
echo $url;

在这里插入图片描述

然后去除前面的 / 和后面的 ?

...
$url = str_replace($script_name, '' ,$request_url);
$url = str_replace($query_string,'',$url);
$url = ltrim($url,'/');
$url = rtrim($url,'?');
echo $url;

在这里插入图片描述

然后变成数组的形式

$url = explode('/',$url);
print_r($url);

在这里插入图片描述

接着各区所需

$model = $url[0];
$controller = $url[1];
$action = $url[2];

先定义一个路径

define("APP_PATH",dirname(__DIR__));
...
$path = APP_PATH.'/app/'.$model.'/controller/'.$controller.'.php';
echo $path;
...

在这里插入图片描述

实例化控制器 访问方法

...
define("APP_PATH",dirname(__DIR__));
$path = APP_PATH.'/app/'.$model.'/controller/'.$controller.'.php';
require_once $path;
$new = new $controller;
$new ->$action();
...

在这里插入图片描述

<?php
define("APP_PATH",dirname(__DIR__));

// /public/index.php
$script_name=$_SERVER['SCRIPT_NAME'];  

// /public/index.php/index/home/index?id=123&titile=456
$request_url=$_SERVER['REQUEST_URI'];  

// id=123&titile=456
$query_string=$_SERVER['QUERY_STRING']; 


$url = str_replace($script_name, '' ,$request_url);
$url = str_replace($query_string,'',$url);
$url = ltrim($url,'/');                          
$url = rtrim($url,'?');
$url = explode('/',$url);


$model = $url[0];
$controller = $url[1];
$action = $url[2];

$path = APP_PATH.'/app/'.$model.'/controller/'.$controller.'.php';
require_once $path;
$new = new $controller;
$new ->$action();

然后优化一下目录访问路径

/public/index.php

...
if(count($url) >= 3){
    $model = $url[0];
    $controller = $url[1];
    $action = $url[2];
} else {
    $model = 'index';
    $controller = 'Home';
    $action = 'index';
}
...

/config/app.php

<?php
return[
    'default_module'        =>  'index',
    'default_controller'    =>  'Home',
    'defalut_action'        =>  'index',
];

然后替换代码

/public/index.php

...
else{
    $config = require_once APP_PATH . '/config/app.php';
    $model =  $config['default_model'];
    $controller = $config['default_controller'];
    $action =  $config['default_action'];
}

然后访问http://127.0.0.1:3678/index.php/

在这里插入图片描述


但其实不需要很多入口文件,所以这里就把原本的index.php入口文件构建到核心文件Pro中,除此之外如果count >=3时,若访问不存在的控制器例如/index/index/index,他还是会报错,所以通过下边的三个if语句,再次进行优化

/Pro/Pro.php

<?php
class Pro
{
    public static function init()
    {
        $script_name = $_SERVER['SCRIPT_NAME'];  // /public/index.php
        $request_url = $_SERVER['REQUEST_URI'];  // /public/index.php/index/home/index?id=123&titile=456
        $query_string = $_SERVER['QUERY_STRING']; // id=123&titile=456

        // 需要 index/home/index
        $url = str_replace($script_name,'',$request_url);  // /index/home/index?id=123&titile=456
        $url = str_replace($query_string,'',$url);         // /index/home/index?
        $url = ltrim($url,'/');                          // index/home/index?
        $url = rtrim($url,'?');                          // index/home/index
        $url = explode('/',$url);

        if(count($url) >= 3){
            $model = $url[0];
            $controller = $url[1];
            $action = $url[2];
        } else {
            $config=require_once APP_PATH.'/config/app.php';
            $model = $config['default_model'];
            $controller = $config['default_controller'];
            $action = $config['default_action'];
        }
        //判断应用模块
        if(!is_dir(APP_PATH.'/app/'.$model)){
            exit("应用模块<".$model.">不存在!");
        }

        $path = APP_PATH.'/app/'.$model.'/controller/'.$controller.'.php';
        //判断控制器
        if(!file_exists($path)){
            exit("控制器<".$controller.">不存在!");
        }
        require_once $path;
        $new = new $controller;
        //判断方法
        if(!method_exists($new,$action)){
            exit("方法< ".$action ." >不存在");
        }
        return ['new'=> $new,'action'=>$action];
    }
}

/Pro/App.php

<?php
define('APP_PATH',dirname(__DIR__));
require_once APP_PATH.'/Pro/Pro.php';

$init = Pro::init();
$new = $init['new'];
$action = $init['action'];
$new->$action();

/public/index.php

<?php
define('APP_PATH',dirname(__DIR__));
require_once APP_PATH.'/Pro/App.php';
?>

此时就可以通过 index.php,访问到核心文件的入口了,访问不存在的应用模块、控制器、方法时会返回提示信息,如下图访问方法 abc 时,则会输出提示信息

http://127.0.0.1:3678/index.php/index/home/abc

在这里插入图片描述


访问视图层

/app/index/view/home/index.php

<?php
echo "This is view";

此时只需要修改Home.php的index方法,便可直接访问到视图层

<?php

class Home{

    public function index(){
        require_once APP_PATH .'/app/index/view/home/index.php';
    }

在这里插入图片描述


然后把核心的代码写入到核心文件里

/Pro/Pro.php

<?php
class Pro
{
    public static function init()
    {
        $script_name = $_SERVER['SCRIPT_NAME'];  // /public/index.php
        $request_url = $_SERVER['REQUEST_URI'];  // /public/index.php/index/home/index?id=123&titile=456
        $query_string = $_SERVER['QUERY_STRING']; // id=123&titile=456

        // 需要 index/home/index
        $url = str_replace($script_name,'',$request_url);  // /index/home/index?id=123&titile=456
        $url = str_replace($query_string,'',$url);         // /index/home/index?
        $url = ltrim($url,'/');                          // index/home/index?
        $url = rtrim($url,'?');                          // index/home/index
        $url = explode('/',$url);

        if(count($url) >= 3){
            $model = $url[0];
            $controller = $url[1];
            $action = $url[2];
        } else {
            $config=require_once APP_PATH.'/config/app.php';
            $model = $config['default_model'];
            $controller = $config['default_controller'];
            $action = $config['default_action'];
        }

        define('MODEL',$model);
        //判断应用模块
        if(!is_dir(APP_PATH.'/app/'.$model)){
            exit("应用模块<".$model.">不存在!");
        }

        $path = APP_PATH.'/app/'.$model.'/controller/'.$controller.'.php';
        //判断控制器
        if(!file_exists($path)){
            exit("控制器<".$controller.">不存在!");
        }
        require_once $path;
        $new = new $controller;
        //判断方法
        if(!method_exists($new,$action)){
            exit("方法< ".$action ." >不存在");
        }
        return ['new'=> $new,'action'=>$action];
    }

    public static function view($path,$data){
        $path = APP_PATH .'/app/'.MODEL.'/view/'.$path.'.php';
        require_once $path;

    }
}

/app/index/controller/Home.php

<?php
class Home{
    // require_once APP_PATH .'/app/index/view/home/index.php';
    public function index(){
        Pro::view('home/index','test_test');
    }
}

/app/index/view/home/index.php

<?= $data ?>

此时在访问就是我们传入的 test_test

在这里插入图片描述


页面跳转

先创建个跳转文件 /Pro/Load.php

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1><?=$msg?></h1>
    <h3>页面自动跳转,等待 <b id="msg">3</b>,<a href="javascript:li()">跳转</a></h3>
    <script>
    var msg = document.getElementById("msg");
    var i = 3;
    setInterval(function(){
        i--;
        msg.innerHTML = i;
        if(i<=0){
            window.location.href= "../<?= $path?>";
        }
    },1000);
    function li(){
        window.location.href = "../<?= $path ?>";
    }
    </script>
</body>

</html>

Pro/Pro.php ,创建load方法

public static function load($path,$msg){
    $url=APP_PATH.'/Sentiment/Load.php';
    require_once $url;
}

/app/index/controller/Home.php 通过abc()方法跳转到index方法调用view

<?php
class Home{
    public function index(){
        Sentiment::view('home/index','test_test');
    }
    public function abc(){
        Sentiment::load('home/index',"Muz1");
    }
}

访问 /index.php/index/home/abc

在这里插入图片描述


函数助手

Pro/Common.php,将之前写的view、load函数写到其中

<?php
function dump($data){
    echo "<pre>";
    print_r($data);
    echo "</pre>";
}

function view($path,$data){
    Pro::view($path,$data);
}

function load($path,$msg){
    Pro::load($path,$msg);
}

在/Pro/App.php,进行文件包含

require_once APP_PATH.'/Pro/Common.php';

这时/app/index/controller/Home.php,就不需要通过 Pro::view() 这种方式调用了,而是直接 view(); 即可

除此外dump方法便于输出数组,当index方法中,是数组时调用dump

<?php

class Home
{
    public function index(){
        $data = ['Muz1' => 1,'test' => 2];
        dump($data);
    }
    public function abc(){
        Pro::load('home/index','Muz1');
    }
}

结果

在这里插入图片描述

运行流程是

/public/index.php	-->
	require_once APP_PATH.'/Pro/App.php';
/Pro/App.php	-->
	require_once APP_PATH.'/Pro/Pro.php';
	在Pro.php获取控制器和方法值
/app/index/controller/Home.php(由于App.php包含了Common.php,所以就不用通过::调用方法)

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:32:20  更:2022-09-30 00:32:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:52:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码