PHP面向对象05:MVC和smarty

news2024/10/2 20:31:04

PHP面向对象05:MVC 和 smarty

  • 一、MVC思想
  • 二、MVC代码设计
  • 三、项目单一入口
  • 四、Smarty模板技术
    • 1. 模板技术原理
    • 2. Smarty简单使用
    • 3. Smarty配置
  • 五、Smarty模板变量
  • 六、Smarty内置函数
  • 七、Smarty外部函数

一、MVC思想

  • MVC思想,是一种基于面向对象思想形成的有利于代码复用的设计行为。
    • M:Model,模型,专门负责数据操作,针对数据库部分的代码。一个模型(类)针对一张数据表。
    • V:View,视图,专门负责结果数据渲染。(HTML+CSS+JavaScript)
    • C:Controller,控制器,负责所有的业务处理。一个控制器控制一类业务。
  • MVC思想设计的代码工作逻辑
    • 用户发起请求:请求控制器C
    • 控制器处理业务逻辑:
      • 遇到数据处理需求:请求模型M实现数据库操作
      • 处理结果展示:调用视图V显示渲染数据
浏览器 服务器 控制器 模型 视图 发起请求 控制器接收请求 控制器接收请求 业务处理 数据处理需求 数据库操作 返回数据 数据渲染处理 渲染数据 返回渲染结果 控制器处理完毕 交给服务器 服务器返回执行结果 解析渲染后 的数据结果 浏览器 服务器 控制器 模型 视图
  • DAO(Data Access Object)数据访问对象:因为每个模型都需要进行数据库的连接操作,需要设计一层专门负责数据库初始化部分的对象(类似于二次封装PDO,没有具体业务,只负责数据库底层操作)。
    • 在模型与数据库之间通常会增加一层DAO来专门负责数据库底层实现。
  • 优点和缺点
    • 优势:分类好管理、视觉效果好、维护性强
    • 缺点:前期开发效率低、服务器解析效率低

二、MVC代码设计

  1. 业务设计控制器
    • 根据业务相关性和相似性,将对应业务划分到一起,由一个控制器实现,控制器设计成类,不同方法代表不同业务。
    • 控制器可以区分前后台,可以增加相应的命名空间。
    • 为了后期代码好维护,可以增加控制器后缀Controller
  2. 数据增加模型
    • 一个模型对应一张数据表,对应表的所有操作都会由当前模型类实现。
    • 所有SQL指令都封装在模型中。
    • 增加相应的命名空间,以及模型后缀Model
  3. MVC思想中,会存在许多重复的内容,此时需要我们将重复代码抽象成父类,比如:父类控制器、父类模型。

三、项目单一入口

  • 单一入口:一类业务会统一请求一个对应的控制器。
  • 项目单一入口:所有请求都只请求一个入口文件(index.php)。
  • 优点:保护系统内部的文件结构安全。
  • 缺点:增加前期开发难度。

四、Smarty模板技术

1. 模板技术原理

  • 模板技术:利用特定的占位符放到一个文档中的某个部位,然后利用相应的方式照到对应的占位符,并将数据实现占位符替换。
  • Smarty:是一个使用PHP开发的模板引擎。
  • Smarty能够很好的提升大项目的访问效率,但也会增加开发成本,不适合小项目和数据实时性要求高的项目。

2. Smarty简单使用

  • 解压并重命名
    在这里插入图片描述

  • Smarty占位符默认规则:{$变量名}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	{$hello}
</body>
</html>
<?php
include_once __DIR__."/../smarty/Smarty.class.php";
$s = new Smarty();

# 将要显示的数据传递给模板
$s->assign('hello', 'hello world');

# 显示模板数据
$s->display('smarty.html');

3. Smarty配置

  • 常用配置

    • $smarty->debugging = false;:是否开启debug调试,默认关闭
    • $smarty->template_dir = "templates/";:模板目录
    • $smarty->compile_dir = "templates_c/";:编译目录(Smarty自动创建)
    • $smarty->config_dir = "configs/";:配置项目录
    • $smarty->caching = false;:是否开启缓存
    • $smarty->cache_dir = "cache/";:缓存目录(开启缓存后自动创建)
    • $smarty->cache_lifetime = 3600;:缓存生命周期,单位是s
    • $smarty->left_delimiter = "{";:左定界符
    • $smarty->right_delimiter = "}";:右定界符
  • 配置文件

    • 通常是txt格式
    • 配置格式:
      • 名字 = 值
      • # 代表注释
      • [局部]代表局部访问
    bgcolor = #000000;
    title = "hello"
    [customer]
    pageTitle = 'Customer'
    
  • 加载配置文件:必须在最前面加载配置文件,使用配置文件有两种方式{#xxxx#}{$smarty.config.xxxx}

    <!DOCTYPE html>
    {config_load file='smarty_config'}
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{#title#}</title>
    </head>
    <body bgcolor="{$smarty.config.bgColor}">
    </body>
    </html>
    

五、Smarty模板变量

在Smarty模板中,将模板变量分为三类:

  1. PHP分配变量:利用assign方法分配的变量

    • 标量数据:直接使用标记输出的数据
    • 数组数据:在smarty模板中可以使用下标或者通过.+下标实现
    • 对象数据:在smarty模板中通过对象访问符实现访问
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {$hello}
    
    {$arr.0}   -----   {$arr[0]}
    
    {$obj->name}
    </body>
    </html>
    
    <?php
    include_once __DIR__."/../smarty/Smarty.class.php";
    $s = new Smarty();
    
    class P{
        public $name = "p";
    }
    # 将要显示的数据传递给模板
    $s->assign('hello', 'hello world');
    $s->assign('arr', array(1, 2, 3));
    $s->assign('obj', new P());
    
    # 显示模板数据
    $s->display('smarty.html');
    
  2. Smarty保留变量:超全局预定义变量和Smarty的内置变量,可用于接收表单传递的数据。保留变量很多,具体看手册。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {$smarty.current_dir}
    {$smarty.get.name}
    {$smarty.post.name}
    </body>
    </html>
    
  3. 自定义变量:用户在模板中自定义的变量(不常用)

六、Smarty内置函数

  1. 分支处理
    语法格式:{if}{elseif}{/if}

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    	{if isset($template.post.name)}
    	    {$template.post.name}
    	{else}
    	    没有数据
    	{/if}
    </body>
    </html>
    
  2. 循环处理

    • foreach,更多操作看手册
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {foreach $arr as $val}
        {$val}
    {/foreach}
    
    {foreach from=$arr key='k' item='v'}
        {$k}:{$v}<br>
    {/foreach}
    </body>
    </html>
    
    • section:遍历索引数组。通常用于没有分配数据的循环。
      语法格式:{section name=名字 loop=数据源/循环次数} ... {/section}
  3. 文件包含
    语法格式:{include file = '模板文件'}

七、Smarty外部函数

  1. 系统函数使用:可以直接使用,{函数名(参数)}
  2. 自定义函数使用:在PHP文件中定义,在HTML文件中使用 {函数名(参数)}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将本地文件自动备份到百度网盘?

如何将本地文件自动备份到百度网盘&#xff1f;说到网盘的使用&#xff0c;大家第一个想到的肯定是百度网盘&#xff0c;百度网盘第一个提出网盘这个概念&#xff0c;相信很多小伙伴都是百度网盘的忠实用户&#xff0c;大家也非常喜欢使用百度网盘来存储文件。为什么百度网盘深…

Apache Hadoop生态部署-kafka单机安装

目录 Apache Hadoop生态-目录汇总-持续更新 一&#xff1a;安装包准备 二&#xff1a;安装与常用配置 2.1&#xff1a;下载解压安装包 2.2&#xff1a;配置环境变量 2.3&#xff1a;配置修改server.properties 三&#xff1a;维护kafka 3.1 编写维护脚本 3.2 启动kafk…

el-cascader 级联选择器懒加载的使用及回显 + 点击任意一级都能返回

需要实现的需求 数据渲染使用懒加载点击任意一级都可返回&#xff0c;不需要一直点到最后一级编辑或者查看功能&#xff0c;回显之前选择的数据 实例解析 dom 元素 <el-cascaderv-model"value":options"options":props"props":key"n…

华为服务器驱动下载及安装

1.服务器技术支持网站 https://support.xfusion.com/support/#/zh/home 2.选择软件下载 3.选择服务器型号 4.选择驱动 5.根据需求选择驱动 例如红帽7.4系统 6.安装驱动 自动安装驱动步骤&#xff1a; 1)使用BMC虚拟光驱挂载onboard_driver_xxx.iso: 2)mount /dev/sr0 /mnt …

【vue3】ref , reactive ,toRef ,toRefs 使用和理解

这篇文章是基于理解写的&#xff0c;仅助于理解&#xff0c;如有任何错误之处&#xff0c;感谢指正&#xff01; 文章目录一.ref的使用1. ref的功能主要有两个&#xff1a;2.使用ref注意事项二.reactive的使用三.使用ref 和 reactive 实现双向数据绑定四.toRef 和 toRefs 的使用…

ARM uboot 源码分析7 - uboot的命令体系

一、uboot 命令体系基础 1、使用 uboot 命令 (1) uboot 启动后进入命令行环境下&#xff0c;在此输入命令按回车结束&#xff0c;uboot 会收取这个命令然后解析&#xff0c;然后执行。 2、uboot 命令体系实现代码在哪里 (1) uboot 命令体系的实现代码在 uboot/common/cmd_xx…

PA的包络跟踪电源

对于传统PA&#xff0c;电源一般设计成固定电压供电&#xff0c;电压不可变化。这种设计对于GSM和GPRS等使用恒定包络GMSK调制的系统来说&#xff0c;PA的效率是比较高的。 ​但随着追求更高的数据吞吐量以及更高的频谱效率&#xff0c;在现代的通信系统中使用了更复杂的调制方…

react定义css样式,使用less,css模块化

引入外部 css文件 import ./index.css此时引入的样式是全局样式 使用less 安装 npm i style-loader css-loader sass-loader node-sass -D生成config文件夹 npm run eject配置 以上代码运行完&#xff0c;会在根目录生成config文件夹 进入 config > webpack.config.js 查找…

基于jeecgboot的flowable为uniapp适配的流程页面调整

为了满足在uniapp上也能进行webview的流程页面操作与显示&#xff0c;需要对流程页面&#xff0c;特别是record/index.vue进行修改与适配。 一、对各个内容的宽带进行调整 主要是样式的调整 <el-col :span"16" :offset"4" 都修改成<el-col :span…

倾向得分匹配只看这篇就够了

一、倾向得分匹配法说明 倾向得分匹配模型是由Rosenbaum和Rubin在1983年提出的&#xff0c;首次运用在生物医药领域&#xff0c;后来被广泛运用在药物治疗、计量研究、政策实施评价等领域。倾向得分匹配模型主要用来解决非处理因素&#xff08;干扰因素&#xff09;的偏差。 …

协作对象死锁及其解决方案

协作对象死锁及其解决方案 1.前言 在遇到转账等的需要保证线程安全的情况时&#xff0c;我们通常会使用加锁的方式来保证线程安全&#xff0c;但如果无法合理的使用锁&#xff0c;很可能导致死锁。或者有时我们使用线程池来进行资源的使用&#xff0c;如调用数据库&#xff0…

Swagger狂神学习笔记

学习目标&#xff1a; 了解Swagger的概念及作用 掌握在项目中集成Swagger自动生成API文档 前后端分离 前端 -> 前端控制层、视图层 后端 -> 后端控制层、服务层、数据访问层 前后端通过API进行交互 前后端相对独立且松耦合 产生的问题 前后端集成&#xff0c;前端或…

支持U盘数据、误删文件、硬盘数据 、回收站数据恢复的软件

好用的Windows数据恢复软件的标准 在数字和信息经济时代&#xff0c;数据是必不可少的。没有人可以承受由于意外删除、格式化和其他原因导致数据丢失的风险。与其在数据恢复服务上花费大量资金或花费大量时间努力自己取回数据&#xff0c;用户更喜欢使用Windows数据恢复软件…

Ask林曦|来回答,30个你关心的日常问题(一)

在林曦老师的线上书法直播课上&#xff0c;上课前后的聊天时间里&#xff0c;时常有同学向林曦老师提问&#xff0c;这些问题涵盖了日常生活的诸多方面&#xff0c;从身体的保养&#xff0c;到快乐的法门&#xff0c;皆是大家感兴趣的&#xff0c;也都共同关切的。      暄…

破解票房之谜:为何高票房电影绕不过“猫眼们”?

如此火爆的春节档很多&#xff0c;如此毁誉参半的春节档鲜有。2023开年&#xff0c;集齐张艺谋、沈腾的《满江红》&#xff0c;以及有票房前作打底的《流浪地球2》接连两部春节档电影票房进入前十&#xff0c;为有些颓靡的中国电影市场注入了一针“强心剂”。与票房同样热闹起来…

git实战技巧-本地刚做出的修改、暂存和提交如何进行撤销

1、解决思路工作区和暂存区内容的撤销&#xff0c;直接按照对应命令或者IDEA界面完成操作就行。对于已提交的撤销回滚建议如下&#xff1a;1. 代码如果仅仅是回撤到指定版本&#xff0c;该版本之上的更新是不需要的&#xff0c;选择Hard模式。2. 代码回撤到指定版本时&#xff…

父传子与子传父步骤

父传子&#xff1a; 问题&#xff1a;父页面中引入子组件 把想要传给子页面的值用在子组件中用 &#xff1a;值“值” (用同一个值好区分)来绑定。 在子页面中用props接收 子组件不能改变父组件传过来的值。&#xff08;传多个页面的时候是&#xff0c;比如父传孙的时候我会…

2020蓝桥杯真题门牌制作(填空题) C语言/C++

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝要为一条街的住户制作门牌号。 这条街一共有 2020 位住户&#xff0c;门牌号从 1 到2020 编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符&#xff…

两款全新模式——代言人、合伙人的玩法分享

近几年来&#xff0c;伴随着技术创新与时代发展趋势&#xff0c;线上消费订单配送服务高效率变得更加高&#xff0c;生活节奏的加快也使人们对于消费及时性越来越注重&#xff0c;及时要求已经大爆发。 用户的消费方式也发生了翻天覆地的变化&#xff0c;消费者跟商家不再是单…

jvm常识

Jvm工作原理学习笔记0126一、JVM的生命周期1.JVM实例对应了一个独立运行的java程序它是进程级别a)启动。启动一个Java程序时&#xff0c;一个JVM实例就产生了&#xff0c;任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点b)运行。ma…