首页 > 其他分享 >mvc原理与依赖注入

mvc原理与依赖注入

时间:2024-08-20 19:26:28浏览次数:12  
标签:function 依赖 container mvc new 原理 model table view

 
<?
//模型层:当前页面要显示的数据

$pdo = new PDO('mysql:host=localhost;dbname=16','root','3.1415926',[PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING]);
$users = $pdo->query('SELECT `id`,`gender`,`uname`,`c_time` FROM `user` order by id asc LIMIT 10')->fetchAll(PDO::FETCH_ASSOC);
?>

 <!-- 视图层 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>数据显示</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <table border="1" cellspacing="0" cellpadding="5" align="center">
        <caption>用户信息表</caption>
        <thead>
            <tr align="center">
                <td>编号</td>
                <td>姓名</td>
                <td>性别</td>
                <td>创建时间</td>
                <td>操作</td>
            </tr>
        </thead>
        <tbody>
            <?php foreach($users as $user):?>
                <tr align="center">
                    <td><?= $user['id']?></td>
                    <td><?= $user['uname']?></td>
                    <td><?= $user['gender']==1 ? '男': '女'?></td>
                    <td><?= date("Y-m-d H:i:s",$user['c_time'])?></td>
                    <td><button>删除</button> <button>编辑</button></td>  
                </tr>
            <?php endforeach;?>     
        </tbody>
        </table>
        
</body>
</html>
<!-- 分离,就是要减少耦合,也就是说,不要在页面上进行数据访问和处理,也不要在业务层试图控制页面的现实逻辑。划分清二者的职责 -->

  

<?php

namespace mvc_demo;  
// require 'Model.php';  
  
class View{  
    public function fetch($data)  
    {  
        $table = '<table>'; // 初始化表格  
        $table .= '<caption>用户信息表</caption>'; // 添加表头标题  
        $table .= '  
        <tr align="center">  
            <td>编号</td>  
            <td>姓名</td>  
            <td>性别</td>  
            <td>创建时间</td>  
            <td>操作</td>  
        </tr>  
        ';  
        foreach($data as $user)  
        {  
            $user['gender'] = $user['gender'] == 1 ? '男' : '女'; // 注意移除了性别后的空格  
            $table .= '<tr>';  
            $table .= '<td>'.$user['id'].'</td>';  
            $table .= '<td>'.$user['uname'].'</td>';  
            $table .= '<td>'.$user['gender'].'</td>';  
            $table .= '<td>'.date("Y-m-d H:i:s", $user['c_time']).'</td>'; // 修正了日期格式中的分钟占位符  
            $table .= '<td><button>删除</button> <button>编辑</button></td>';  
            $table .= '</tr>';  
        }  
        $table .= '</table>'; // 闭合表格  
        return $table;  
    }  
}  
  
echo '<style>  
table {border-collapse: collapse; border: 1px solid; text-align: center; width: 600px;}  
caption {font-size: 1.2rem; margin-bottom: 10px;}  
tr:first-of-type { background-color: lightblue;}  
td, th {border: 1px solid; padding: 5px;}  
</style>';  
  
// 假设Model类中的方法名已经更正为getData()  
// $data = (new Model)->getData();
// echo (new View)->fetch($data); 
  

?>

  

<?php
namespace mvc_demo;
use PDO;
class Model
{
    public function getData()
    {
         return(new PDO('mysql:host=localhost;dbname=16','root','3.1415926',
        [PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING]))->query('SELECT `id`,`gender`,`uname`,`c_time` FROM `user`order by id asc LIMIT 10')->fetchALL(PDO::FETCH_ASSOC);
    }
    public function editData()
    {
        
    }
}
// print_r((new Model)->getData());

?>

  

<?php
// mvc这种架构模式 ur1地址都会映射到控制器下面的具体操作方法上
class User{
    function index($id,$name)
    {
        return "您好 $name,您的id是 $id";
    }
}
function getName()
{
    return '你好呀';
}
// var_dump($_SERVER['PATH_INFO']);//string(11) "/User/index"
$arr = array_values(array_filter(explode("/",$_SERVER['PATH_INFO'])));
// var_dump($arr);//array(2) { [0]=> string(4) "User" [1]=> string(5) "index" }
$controller = __NAMESPACE__.'\\'.array_shift($arr);
// echo $controller;
$action = array_shift($arr);
// echo $action;

$params = ['id'=>1,'name'=>''];

echo call_user_func_array([(new $controller),$action],$params);

?>

  

<?php
namespace mvc_demo;
/**
 * facade门面为容器中的(动态)类提供了一个静态调用接口,相比于传统的静态方法调用,带啦了个好的可测试性和可扩展性。
 * facade就是在服务器和控制器之间加了一个中间层
 */
require 'Container.php';
class Facade{
    // 为容器中的动态类提供一种静态调用接口
    protected static $container;
    public static function initialize(Container $container)
    {
        static::$container = $container;
    }
}



?>

  

<?php
//控制器层  中间层 协调 m v的中间桥梁
namespace mvc_demo;
require 'Facade.php';


// 模型类成员getData()的访问静态化 
class FacadeModel extends Facade
{
    public static function getData()
    {
        return static::$container->make('model')->getData();
    }
}


class FacadeView extends Facade{
    public static function fetch($data)
    {
        return static::$container->make('view')->fetch($data);
    }
}





class Controller{
    

    public function __construct($container)
    {
       Facade::initialize($container);

    }

    public function index()
    {
         // 1. 获取数据 
       $data =  FacadeModel::getData();

       // 2. 渲染数据
       return FacadeView::fetch($data);
    }
   
}


// 客户端代码

$C = new Controller($container);
echo $C->index();

  

<?php
//控制器层  中间层 协调 m v的中间桥梁
namespace mvc_demo;
require 'Container.php';
class Controller{
    protected $container;

    public function __construct($container)
    {
        $this->container = $container;

    }

    public function index()
    {
         // 1. 获取数据 
       $data =  $this->container->make('model')->getData();

       // 2. 渲染数据
       return $this->container->make('view')->fetch($data);
    }

    public function edit()
    {
        $this->container->make('model')->editData();
    }
}


$C = new Controller($container);
echo $C->index();

  

<?php
// 控制器层 中间层 协调  m v 的中间桥梁
namespace mvc_demo;
require 'Model.php';
require 'View.php';
// class Controller
// {
//   
//     public function index (Model $model,View $view)
//     {
//         // 1.获取数据
//         $data = $model->getData();
//         // 2.渲染数据
//         return $view->fetch($data);
//     }

//     public function edit(Model $model)
//     {

//     }

// }
class Controller
{
    protected $model;
    protected $view;
    // 将外部依赖对象在构造方法中注入进来 完成外部对象在本类多个方法中的共享
    public function __construct(Model $model, view $view)
    {
       $this->model=$model;
       $this->view = $view;
    }

    public function index ()
    {
        // 1.获取数据
        $data = $this-> model->getData();
        // 2.渲染数据
        return $this-> view->fetch($data);
    }

    public function edit()
    {
        $this->model->editData();
    }

}
$model = new Model;
$view = new View;
$c = new Controller($model,$view);
echo $c->index();

// -----------------------------------------------------------
// 如果当前所依赖的外部对象过多,名称过长 将依赖的所有外部对象放到一个容器中统一管理,并且还可以起别名
?>

  

<?php
/**
 * 容器 container 依赖注入的类 统一由容器进行管理,容器 数组
 * 如果当前类的依赖对象过多,可能将这些依赖的对象,类,闭包,放到一个”服务器“中进行统一管理 bind make
 */

 namespace mvc_demo;
 use Closure;

  //类的加载 可升级为自动加载
  require 'Model.php';
  require 'View.php';
 

//  服务容器 一个自动生产类/对象的工厂
class Container{
    //对象容器
    protected $instances =[];
   /**
    * 绑定一个类,闭包,实例,接口实现到容器
    *@access public
    *@param string|array $abstract 类标识或者接口的别名 alias
    *@param mixed $concrete 要绑定的类,闭包,或者实例
    */
    
    // 

    public function bind($abstract ,Closure $concrete)
    {
        $this->instances[$abstract] = $concrete;

    }
    public function make($abstract,$params=[])
    {
        return call_user_func_array($this->instances[$abstract],$params);

    }

}
$container = new Container;
//绑定一个闭包到服务器中  我们使用$model对象时才去实例化
$container->bind('model',function(){
    return new Model;
});

$container->bind('view',function(){
    return new View;
});

?>

  

标签:function,依赖,container,mvc,new,原理,model,table,view
From: https://www.cnblogs.com/QWD7986/p/18370121

相关文章

  • 想做硬件,三极管放大电流原理你必须懂
    三极管的电流放大原理是基于其内部结构和电流分配机制来实现的。这一原理主要涉及三个电极:发射极(E)、基极(B)和集电极(C),以及它们之间的相互作用。以下是三极管电流放大原理的详细解析:一、三极管的结构三极管由两个PN结组成,即发射结和集电结,它们分别由发射极与基极之间、基极与集......
  • webpack 热更新实现原理
    修改entry配置首先通过启动webpack-dev-server会修改webpack.config.js的entry配置,新增两个入口文件:webpack-dev-server/client/index.jswebpack/hot/dev-server.jswebpack-dev-server/client/index.js包含的是客户端向服务端通信的相关代码。webpack/hot/dev-s......
  • XSS 基本概念和原理介绍
    XSS基本概念和原理介绍基本概念跨站脚本攻击XSS(CrossSiteScripting),为了不和层叠样式表(CascadingStyleSheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意JavaScript代码,当用户浏览该页面时,嵌入在Web里面的JS代码会被解......
  • 《深入探究 @SpringBootApplication 注解的内部原理》
    《深入探究@SpringBootApplication注解的内部原理》@SpringBootApplication注解涵盖了SpringBoot的包扫描原理、自动装配原理等众多重要原理。接下来,我们将对该注解展开深入且详尽的研究。而研究上述原理的关键,在于剖析@SpringBootApplication内部的构成结构,如下图:......
  • Mongo主从同步原理
    Mongo主从同步原理是基于复制集(replicateset).复制集是一组mongodb实例,其中一个实例为主节点,其他实例为从节点。主节点负责所有数据写操作,并将写操作的结果复制到从节点。从节点只能读取数据,不能写入数据在mongo中,主节点和从节点之间的数据同步是通过oplog(操作日志)实现的。Oplog......
  • 打气泵方案PCBA组成和运行原理
    打气泵是一种用来将气体(通常是空气)注入到物体中的装置。其运行原理可以分为以下几个步骤:压缩气体:打气泵通常通过电机或发动机驱动,将气体(一般是空气)抽入泵内。在泵内,气体被一个或多个叶片回转或活塞往复的运动压缩。建立压力:通过压缩,气体的体积减小,压力增加。当气体......
  • 多重示例详细说明Eureka原理实践
    Eureka原理(EurekaPrinciple)是指在长时间的思考和积累之后,通过偶然的瞬间获得灵感或发现解决问题的方法的一种认知现象。这个过程通常包括三个主要阶段:准备阶段、潜伏期以及突然的灵感爆发。下面详细说明Eureka原理的实践步骤:1.准备阶段广泛阅读与研究:在这个阶段,研究者需......
  • 国产GD32单片机开发入门(一) GD32F103C8T6开发板电路原理图分析
    文章目录一.概要二.技术名词解释三.板子主要电子器件四.原理图电路分析1.原理图总览2.电源电路1)5V电路2)3.3V电路3.LED指示灯电路4.复位电路5.晶振电路1)高频晶振电路2)低频晶振电路6.调试下载电路1)调试电路(SWD接线方式)2)BOOT电路7.外围接口电路8.模块拓展接口9......
  • 关系代数、函数依赖、Armstrong公理及软考试题解析
    注:本文面向于软考高级—系统架构设计师,具体来说是数据库部分,知识点偏零碎化。想要系统学习数据库原理的,可考虑去看《数据库原理》,清华大学出版社或其他出版社皆可。概述概念关系,就是二维表。特性:列不可分性:关系中每一列都是不可再分的属性,即不能出现如下复合属性行列无序性:......
  • unbuntu更新Python3版本到最新,安装依赖手动编译
    安装依赖sudoaptupdatesudoaptinstallbuild-essentialzlib1g-devlibffi-devlibssl-dev下载安装包,手动配置编译官网查找对应linux版本tgz包wgethttps://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgztar-xzvfPython-3.11.0.tgzcdPython-3.11.0......