MVC开发模式以及Smarty模板引擎的使用

Linux 全局安装 composer

将目录切换到/usr/local/bin/目录
    cd /usr/local/bin/
在 bin 目录中下载 composer
    curl -sS https://getcomposer.org/installer | php
通过 composer.phar -v 查看 composer
修改为中国镜像
    composer.phar config -g repo.packagist composer https:packagist.phpcomposer.com
最后我把composer.phar复制了一份,重命名为composer
以后可以直接用composer

MVC架构模式
控制器(Controller)- 负责转发请求,对请求进行处理
视图(View) - 界面设计人员进行图形界面设计
模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)

实现简易模板引擎:

composer.json

    {
       自动加载
       可以在composer.json的autoload字段找那个添加自己的autoloader
      "autoload": {
        psr-4: {
          App\\Controllers\\": Controllers/,App\\Models\\Models/Tools\\Tools/
        }
      }
    }

Models/Users.php

    <?php
     model层数据库操作演示
    namespace App\Models;

    class Users
    {
         数据存入数据库演示
        public function store()
        {
            echo 'store into database';
        }

         查询数据库演示
         function getUsername()
        {
             查询数据库
            return test-data;
        }
    }

Controllers/UserController.php

    <? App\Controllers;

    use Tools\Tpl;
    use App\Models\Users;

     UserController extends Tpl
    {
         function create()
        {
            echo User create function getUser()
        {
             通过Model查询数据
            $userModel = new Users;
            $username = $userModel->getUsername();

             将$username显示在对应的一个HTML文件当中,并且显示出来
             表现层 user/user.html
             将变量发送给模板(html文件)
            $this->assign(usernameage',20);
             显示模板
            $this->display(user/user.html);
        }
    }

Views/user/user.html

    <!DOCTYPE html>
    <html lang=en">
    <head>
        <meta charset=UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h2>
            {$username}
        </h2>
        <h3>
            {$age}
        </h3>
    </body>
    </html>

Tools/Tpl.php

    <? 分配变量
     将变量发送给模板
     Tools;

     Tpl
    {
        protected $assign_vars = [];

         function assign($tpl_var_name,$val)
        {
            $this->assign_vars[$tpl_var_name] = $val;
        }

         function display($tpl_name)
        {
             Views/user/$tpl_name
            $className = get_called_class();  App\Controllers\UserController
            $dirName = strtolower(substr(substr($className,1)">16),1)">0,-10));  user
            $dir = dirname(__DIR__) . /Views/' . $dirName . / . $tpl_name;
             file_get_contents
            $content = file_get_contents($dir);
             preg_replace
            foreach ($this->assign_vars as $tpl_var_name => $val) {
                $content = preg_replace(/\{\$' . $tpl_var_name . \}/<?php echo $this->assign_vars[""]; ?> compile
            $compile = dirname(__DIR__) . /runtime/Compile/' . md5($tpl_name) . .php;
            file_put_contents($compile,$content);
             include
            include $compile;
        }
    }

Smarty模板引擎的使用

服务端开发部分演示
Smarty引擎的安装
变量的分配和加载显示模板
以插件形式扩展Smarty
缓存控制技术


smarty.php

    <?/**
     * Created by PhpStorm.
     */
    session_start();
    require './libs/Smarty.class.php';

    $smarty =  Smarty();

     简单配置 初始化设置
    $smarty->setTemplateDir('./Views');
    $smarty->setCompileDir('./runtime/Compile'$smarty->setConfigDir('./Config'$smarty->addPluginsDir('./Plugins'$smarty->setCacheDir('./runtime/Cache');

    $smarty->caching = 1;开启缓存
    $smarty->setCacheLifetime(60*60*24$smarty->left_delimiter = '{';
    $smarty->right_delimiter = '}';

     缓存机制
    if (!$smarty->isCached('extends.html',1)">$_SERVER['REQUEST_URI'])) {

         数据库查询
        $data = [[]];

         使用 
        $smarty->assign([
            'username' => 'test-data','age' => 20
        ]);

         数组
        $smarty->assign('arr1',[1,2,3]);
        $smarty->assign('arr2',['id' => 1,'username' => 'zhangsan','age' => 30$smarty->assign('users', [
            ['id' => 1,'age' => 30],1)">
            ['id' => 2,'username' => 'lisi','age' => 40]
        ]);

        $smarty->assign('hobby_ids',1)">$smarty->assign('hobby_output',['看书','敲代码','看视频'$smarty->assign('options',1)"> [
            1 => '看书',2 => '敲代码',3 => '看视频' 注册function
        $smarty->registerPlugin('function','font',1)">function ($attributes) {
           $text = $attributes['text'];
           $color = $attributes['color'] ?? 'black';
           return '<span style="color: ' . $color . '">' . $text . '</span>';
        });

         注册变量修饰器
        $smarty->registerPlugin('modifier','link',1)">$text,1)">$href,1)">$isCapitalize = false$return = '<a href="' . $href . '">' . $text . '</a>'if ($isCapitalize) {
               return ucwords($return);
           }
           ;
        });
        
         注册块状函数
        $smarty->registerPlugin('block',1)">$attributes,1)">$text$href = $attributes['href'];
           if (!is_null()) {
               return '<a href="' . ;
           }
        });

         对象
        $smarty->assign('obj',1)">$smarty);

        $smarty->assign('text','This is a paragraph!'$smarty->display('smarty.html');
        $smarty->display('loop.html'$smarty->display('single_tag_func.html'$smarty->display('modifier.html'$smarty->display('block_func.html'$smarty->display('plugins.html'$data);
    }
    $smarty->clearCache('extends.html',1)">]);
    clearAllCache();
    $smarty->display('extends.html',1)">$_SERVER['REQUEST_URI']);

前端开发部分演示

注释和变量的使用smarty.html

<!DOCTYPE html>
<html lang="en"head>
    meta charset="UTF-8"title>Title</bodyh2>
        <!-- 模板注释被*星号包围,而两边的星号又被定界符包围 -->
        {*$username*}
        {$username}
    h3 变量 
        {$age}
    hr 索引数组 
        arr1:
        {$arr1[1]}
     关联数组 
        arr2:
        {$arr2['username']}
        {$arr2.username}
     对象 
        Object:
        {var_dump($obj->getTemplateDir())}
     变量的运算 
        {$var = 100}
        {$var}
        {$foo = $var + 200}
        {$foo}
    >
        {$foo}
     保留变量的使用 
        $_GET:
        {var_dump($smarty.get)}
    
        $_POST:
        {var_dump($smarty.post)}
    
        $_REQUEST:
        {var_dump($smarty.request)}
    
        COOKIE:
        {var_dump($smarty.cookies)}
    
        SESSION:
        {var_dump($smarty.session)}
    
        SERVER:
        {var_dump($smarty.server)}
    
        ENV:
        {var_dump($smarty.env)}
    
        {time()}
        {$smarty.now}
     加载配置文件后,配置文件中的变量需要用两个井号“#”包围或者是 smarty的保留变量$smarty.config.来调用 
        {config_load file='base.conf'}
        {#FONT_SIZE#}
        {$smarty.config.FONT_COLOR}
html>

流程控制的使用loop.html

>流程控制>
     使用{if}处理分支结构 
    {$number = 200}
    {if $number === 100}
        gt
    {else if $number == 200}
        This number is 200
    {else}
        This number is not 100
    {/if}

    {$bool = false}
    {if not $bool}
        not
    {/if}

    {if $number is not even}
        odd
    {/if}

    {if $number is not odd}
        even
    {/if}

    {if $number mod 2 == 0}
        even
    {/if}

    {if $number is not odd by 3}
        odd
    {/if}

     使用{for}处理循环 
    {for $i = 5 to 4 step 2}
        {$i}
    {forelse}
        no loop
    {/for}

     使用{while}处理循环 
    {while $number > 195}
        {$number--}
    {/while}

     使用{foreach}遍历数组 
    {foreach $arr2 as $key => $val}
        {if $val@first}
            {*break*}
            {continue}
        {/if}
        {$key}:{$val}
        {$val@key}
        {$val@index}
        {$val@iteration}
        {$val@first}
        {$val@last}
        {$val@show}
        {$val@total}
    {foreachelse}
        data does not exist
    {/foreach}

     使用{section}遍历数组 
    {section name=key loop=$arr1}
        {$arr1[key]}
    {/section}

    {section name=key loop=$users2 step=-1 max=2}
        id: {$users[key].id}
        username: {$users[key].username}
        age: {$users[key].age}
        {$smarty.section.key.index}
        {$smarty.section.key.iteration}
        {$smarty.section.key.rownum}
        {$smarty.section.key.index_prev}
        {$smarty.section.key.index_next}
    {sectionelse}
        no loop
    {/section}

>

常用标签函数的使用single_tag_func.html

>常用标签函数的使用
    {assign var="name" value="Jason"}
    {assign "name" "Jason Lee"}
    {$name}

    {append var="arr1" value=4 index="3"}
    {var_dump($arr1)}

    {ldelim}$name{rdelim}

    {html_checkboxes name="hobby" values=$hobby_ids output=$hobby_output selected=$hobby_ids}
    {html_checkboxes name="hobby" options=$options selected=$hobby_ids}
    {html_image width="50" height="50" alt="Google" href="http://www.google.com" file="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"}
    {html_options name="hobby" values=$hobby_ids output=$hobby_output selected=2}
    {html_options name="hobby" options=$options selected=2}
    {html_radios name="hobby" options=$options selected=2}
    {html_select_date}
    {html_select_time}
    {html_table loop=$arr1 cols=2 rows=3}
    {mailto address="86267659@qq.com" subject="test" text="给我发邮件" cc="123123@qq.com"}
    {math equation="x + y" x = 100 y = 200}
>

变量修饰器的使用modifier.html

>变量修饰器的使用
    {$str="123123\nthIs is string."}
    
    {$str|capitalize:true:true}
    
    {$str|capitalize:true:true|cat:'.'}
    
    {$str|count_characters}
    
    {$str|count_paragraphs}
    
    {$str|count_sentences}
    
    {$str|count_words}
    
    {$str2|default:'Not Data Yet'}
    
    {time()|date_format:'%Y-%m-%d %H:%M:%S'}
    
    {$chinese = '中文'}
    {$chinese|from_charset:'utf-8'|to_charset:'gb2312'}
    
    {$str|indent:10:'---'}
    
    {$str|lower|upper}
    
    {$str2="This is p1.\nThis is p2."}
    {$str2|nl2br}
    
    {$str|regex_replace:'/\d+/':' '}
    
    {$str|replace:'123123':'000'}
    
    {$str|spacify:'-'}
    
    {$float='10.0020398475'}
    {$float|string_format:'%.2f'}
    
    {$str3='a     b     c'}
    {$str3|strip:'-'}
    
    {$tag='b>Font'}
    {$tag|strip_tags}
    
    {$bigstr='123123123123123123ahjfdashfksdhfkjsdhjkfshfjkhsd'}
    {$bigstr|truncate:10:'---':true:true}
    
    {$tag|escape|unescape}
    
    {$bigstr|wordwrap:10:"\n":true}
>

块函数的使用block_func.html

>块函数的使用
    {textformat indent='4' indent_first='10' indent_char='-' wrap='10' wrap_char='' wrap_cut=true assign='var'}
    aaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaa
    {/textformat}

    {*$var*}

    {nocache}
        {time()}
    {/nocache}
    
    {time()}
>

插件的开发plugins.html


    {font text=$text color='#123123'}
    {$text|link:'http://www.baidu.com'}
    {link href='http://www.baidu.com'}
        aaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaa
    {/link}
>

Smarty模板引擎插件的开发:
1、使用registerPlugin( )方法扩充插件格式


2、在smarty模板的libs/plugins/目录下创建函数插件文件

block.link.php

function smarty_block_link()
{
    ];
    )) {
        ;
    }
}

function.font.php

function smarty_function_font(];
    ;
    ;
}

modifier.link.php

function smarty_modifier_link() {
        );
    }
    ;
}

模板继承的使用
extends.html

!-- 使用{extends}函数实现模板继承
合并子模板和父模板的{block}标签内容 -->

{extends file="layout.html"}
{block name="title"}
    Article {$smarty.block.parent}
{/block}

{block name="content"}
    Article List
    {$smarty.get.page}
    {*nocache*}
        {time()}
    {*/nocache*}
    {time()|date_format:'%H:%M:%S' nocache}
{/block}

layout.html

>{block name="title"} - Imooc{/block}header
        menu
    
    {block name="content"}{/block}
    footer
        copyright
    >

缓存机制
开启缓存
  $smarty -> caching = 1|2|0;
  $smarty -> setCacheDir("./cache");
  $smarty->setCacheLifetime(300); // 5分钟,以秒为单位,-1永不过期
  $smarty -> display('index.tpl');
  $smarty -> display('index.tpl',$_SERVER['REQUEST_URI']);

相关函数
  isCached()
  clearCache()
  clearAllCache()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


随着云计算和网络技术的发展,越来越多的数据需要在服务器之间进行传输和共享。云挂机宝作为一种常见的服务器设备,具有高效、稳定的特性,使得它成为了许多企业和个人用户传输数据的首选。本文将讨论云挂机宝服务器
阿里云服务器Tomcat无法从外部访问一、环境阿里云Ubuntu 12.04.5 LTStomcat和java都是阿里云默认的7的版本,如下图二、问题部署后./startup.sh启动tomcat 之后外部访问http://ip:8080/无法访问,之后去查看防火墙关闭了Ubuntu下面的防火墙123
购买一系列的东西其实就是花钱买块区域,服务器,域名,云解析,花了好多money。。。一、租服务器百度搜索阿里云进入官网首页,点击登录进入登录页面,可以使用邮箱登录或者注册进入注册页面,填写注册信息登录成功,进入主页,点击云服务ECS,点击购买推荐或者选购配置根据实际情况选择产品,可能没有货,那么就需要更改购买条件如果是新用户,购买
前言昨天买了域名,服务器,然后搭建了环境,然后想他通过默认的端口,不用端口就访问。设置WEB项目的欢迎页在WEB-INF文件夹下有个web.xml文件(最近新建的项目不包含此文件,可以手动新建),在welcome-file-list节点中设置,代码如下 <welcome-file-list> <welcome-file>test.html</welcome-file>
前言由于服务器centos6.8安装mysql一直出现不能连接问题,然后看到一个方法,一不小心就把yum给删除了,都还原不了,很是绝望,很难受。然后没有yum这个centos就感觉废了,然后找方法装上去。 python --version查看python 版本 whereis python 查看python文件 python: /usr/bin/python2.6 /usr/bin/python
前言用 SSH客户端登录上以后,自己想要在本地连接服务器上的mysql服务器。解决方法1、首先启动数据库[root@iZm5ec880z2rorZ ~]# service mysqld start可以输入一下加粗命令:[root@iZm5ec880z2rorZ ~]# mysql -u root -p Enter password: (输入你的数据库密码)Welcome to the My
前言乱码问题是很让人抓狂的问题,下面我将记录一下Linux下MySQL乱码问题的解决方法。 mysql在linux下乱码问题一、操作mysql默认字符集是latin1,但是我们大部分程序使用的字符集是utf8,我们就需要修改mysql的字符集了。1)查看默认编码show variables like 'character%';+--------------------------+--------
问题描述今天阿里云服务器安装mysql的收,遇到了一个很熟悉的问题 输入#mysql -u root -p ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 解决方案一、方案1 1.#ps -A|grep mysql 显示类似:
今天在使用filezilla连接虚拟机中的ubuntu的时候出现上次出错,错误详情为:open for write: permission denied看完错误大概知道和权限有问题,再次查看虚拟机,我们使用以下命令给我们需要放入的目标文件权限:sudo chmod 777 /home再次尝试上传,上传成功! ...
直接上步骤,做一个简单的记录!配置阿里云oss找到对应的oss如果没有bucket,则新建一个新建之后,进入到对应的bucket,然后进行相关设置以上就是oss的基本设置,接下来是域名相关设置,这也是最重要的一些步骤。oss域名解析和cdn设置oss域名解析设置oss的域名设置是在传输管理下进行设置。如果没有域名,需要添加域名,没有注册域名自行注册。添加之后就会在上面列表上显示。以上就是域名的解析配置,期间还需要设置域名解析cname等。oss的cdn设置加速设置cdn
这个需要开放centos的端口和腾讯云服务器的端口。防火墙开放8080端口因为Centos7以上用firewalld代替了iptables,也就是说firewalld开通了8080端口应该就行了1.输入netstat -tunlp 查看8080是否放开。2.如果没有开放,输入firewall-cmd --state #查看防火墙状态。3.在running 状态下,向firewall 添加需要开放的端口firewall-cmd --permanent --zone=public --add-po
前言:博主资历尚浅,很多东西都还在刚起步学习的阶段,这几天开发任务比较轻,就在自己window系统下,模拟部署远程服务器,利用Jenkins + Ant + Tomcat 搭建了一个自动发布部署的环境
为了做集群测试,在每台机器上装了3个tomcat,每次发布项目的时候都要反复敲一些命令,重启 tomcat 之前先检查 tomcat 进程有没有停掉,没有还要手动 kill 该进程。 发布次数多了,操
Jenkins修改管理员密码,我看了网上所有的教程,竟然全都是拿着一串已经加密好的 111111 的密文去替代 config.xml 文件里面的密码,然后大家的密码都是 111111!我觉得这种做法实
一、四层与七层负载均衡在原理上的区别 1.图示 2.概述 四层负载均衡工作在 OSI 模型中的四层,即传输层。四层负载均衡只能根据报文中目标地址和源地址对请求进行转发,而无法修改或判断所请求资源的具体
和 window不同,在Linux压缩文件需要注意的是,压缩后的文件会把源文件给替代,无论是gzip、bzip2、xz 均不支持压缩目录,要达到压缩目录的目的,需要用到tar指令。 gzip 压缩 g
一、前言 随着每天业务的增长,Tomcat 的catalina.out日志 变得越来越大,占用磁盘空间不说。要查看某个时候的日志的时候,庞大的日志让你顿时无从下手,所以日志的切割的变得刻不容缓。而且,
一、安装 和 准备工作 我们选择了用 Tomcat 服务器下 war 包的安装方式。Jenkins 的下载地址:http://mirrors.jenkins-ci.org/,打开链接后,表格有war列
一、gcc gcc是Linux上面最标准的C语言的编译程序,用来源代码的编译链接。 gcc -c hello.c 编译产生目标文件hello.o gcc -O hello.c 编译产生目标文件,并进行
随着智能化互联时代的来临,家中的智能设备越来越多:电视机、平板、游戏主机、电脑、手机等遍及家中各个角落,同时设备之间共享数据的需求变的越来越强烈。比如同步、备份手机上的照片和视频,在电视机上观看电脑中