<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>路由 &#8211; 个人随笔</title>
	<atom:link href="/label/%E8%B7%AF%E7%94%B1/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sat, 09 Jun 2018 01:14:00 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>/wp-content/uploads/2022/01/cropped-截屏2022-01-01-18.57.09-32x32.png</url>
	<title>路由 &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>TP5.0（一）部署、控制器、模块、命令行、路由、视图、模板赋值、常用标签、搭建后台首页、搭建登录页、页面跳转与重定向、Request 对象</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7391.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7391.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 09 Jun 2018 00:44:26 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[Request 对象]]></category>
		<category><![CDATA[命令行]]></category>
		<category><![CDATA[常用标签]]></category>
		<category><![CDATA[控制器]]></category>
		<category><![CDATA[搭建后台首页]]></category>
		<category><![CDATA[搭建登录页]]></category>
		<category><![CDATA[模块]]></category>
		<category><![CDATA[模板赋值]]></category>
		<category><![CDATA[视图]]></category>
		<category><![CDATA[路由]]></category>
		<category><![CDATA[部署]]></category>
		<category><![CDATA[页面跳转与重定向]]></category>
		<guid isPermaLink="false">/?p=7391</guid>

					<description><![CDATA[一、框架概述 1、什么是框架 框架即英文名为Framework,它是许多代码文件的集合，这些代码文件是程序结构 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>一、框架概述</h1>
<h2>1、什么是框架</h2>
<p>框架即英文名为Framework,它是许多代码文件的集合，这些代码文件是程序结构的代码，不是业务代码，里面包含了许多函数、类库(分页类、验证码类、文件上传类、DB类、Image类&#8230;)、设计模式(mvc、单例、AR..)等。</p>
<p>以后使用框架开发项目只需要写业务代码即可。</p>
<p>现在企业中开发模式基本有三种:</p>
<p>从快到慢排序：二次开发(需要修改源码)&#8212;&gt;框架开发&#8212;-&gt;源码开发</p>
<p>源码开发建房子：从0开始，打地基.、浇筑水泥、、</p>
<p>框架开发建房子：相当于毛坯房,各种装修。</p>
<p>源码开发建房子：相当于精装修的房子，只需要拎包入住.</p>
<p>现在企业开发较多的模式属框架开发。</p>
<h2>2、框架开发的好处</h2>
<ul>
<li>框架能节省开发时间</li>
</ul>
<p>每个项目中常用的类库框架都已经封装好，如分页类、图像类,文件上传类等，直接调用即可,非常方便。（减少重复造轮子）</p>
<ul>
<li>利于团队的合作开发</li>
</ul>
<p>因为框架都是mvc设计模式,模块划分清晰，可以帮助我们快速、稳定、高效搭建web应用，从而提高开发效率。</p>
<ul>
<li>使用框架的过程中可以使得我们的注意力全部集中在业务层面，而无需关心程序的底层架构。</li>
</ul>
<h2>3、框架的设计模式(MVC)</h2>
<p>基本现在主流的框架(CI、TP、laravel、YII、zend framework、symfony、cakephp),都是采用单一入口(index.php),且都是采用mvc的设计模式，把一个web应用程序分为三块,控制器、模型、视图。</p>
<p>C-Controller 控制器</p>
<p>主要作用:就是接收用户的请求,在模型和视图之间起一个调度的作用</p>
<p>M-Model 模型</p>
<p>作用:对数据库做增删改查(curd)的</p>
<p>V-View视图</p>
<p>展示模板内容,给用户一个可操作的界面</p>
<p><strong>mvc(框架)形象理解-酒店（难以理解的东西一定要把抽象的东西给生活化）：</strong></p>
<p><img fetchpriority="high" decoding="async" width="1185" height="451" class="wp-image-7392" src="/wp-content/uploads/2018/06/word-image.png" srcset="/wp-content/uploads/2018/06/word-image.png 1185w, /wp-content/uploads/2018/06/word-image-300x114.png 300w, /wp-content/uploads/2018/06/word-image-768x292.png 768w, /wp-content/uploads/2018/06/word-image-1024x390.png 1024w" sizes="(max-width: 1185px) 100vw, 1185px" /></p>
<h2>常见的php开发框架</h2>
<h3>ThinkPHP框架（TP框架）</h3>
<p>TP框架的logo：</p>
<p><img decoding="async" width="102" height="70" class="wp-image-7393" src="/wp-content/uploads/2018/06/word-image-1.png" /></p>
<p>主要开发中小型项目</p>
<p>ThinkPHP框架是我们国人开发采用mvc模式设计的一款比较优秀的框架。在我们国内使用量较多，且开发文档也多，方便学习。</p>
<h3>（2）CodeIgniter 框架</h3>
<p>CodeIgniter框架：简称CI框架,</p>
<p>主要开发中小型项目</p>
<p><img decoding="async" width="823" height="376" class="wp-image-7394" src="/wp-content/uploads/2018/06/word-image-2.png" srcset="/wp-content/uploads/2018/06/word-image-2.png 823w, /wp-content/uploads/2018/06/word-image-2-300x137.png 300w, /wp-content/uploads/2018/06/word-image-2-768x351.png 768w" sizes="(max-width: 823px) 100vw, 823px" /></p>
<h3>YII(易框架)</h3>
<p>YII(简称易框架):主要开发大型的web应用程序:</p>
<p><img loading="lazy" decoding="async" width="818" height="417" class="wp-image-7395" src="/wp-content/uploads/2018/06/word-image-3.png" srcset="/wp-content/uploads/2018/06/word-image-3.png 818w, /wp-content/uploads/2018/06/word-image-3-300x153.png 300w, /wp-content/uploads/2018/06/word-image-3-768x392.png 768w" sizes="(max-width: 818px) 100vw, 818px" /></p>
<h3>Laravel框架</h3>
<p>此框架使用量世界排名第一,有最”优雅”的框架称号。</p>
<p>注：Laravel底层代码很多都是借鉴了SymFony的优点。</p>
<p><img loading="lazy" decoding="async" width="727" height="477" class="wp-image-7396" src="/wp-content/uploads/2018/06/word-image-4.png" srcset="/wp-content/uploads/2018/06/word-image-4.png 727w, /wp-content/uploads/2018/06/word-image-4-300x197.png 300w" sizes="(max-width: 727px) 100vw, 727px" /></p>
<p>&nbsp;</p>
<h3>（5）Zend官方框架</h3>
<p>Zend Framework：php官方提供的框架，非常笨重，主要开发大型的web应用程序。</p>
<p><img loading="lazy" decoding="async" width="729" height="346" class="wp-image-7397" src="/wp-content/uploads/2018/06/word-image-5.png" srcset="/wp-content/uploads/2018/06/word-image-5.png 729w, /wp-content/uploads/2018/06/word-image-5-300x142.png 300w" sizes="(max-width: 729px) 100vw, 729px" /></p>
<h3>（6）Symfony国外框架</h3>
<p><img loading="lazy" decoding="async" width="687" height="480" class="wp-image-7398" src="/wp-content/uploads/2018/06/word-image-6.png" srcset="/wp-content/uploads/2018/06/word-image-6.png 687w, /wp-content/uploads/2018/06/word-image-6-300x210.png 300w" sizes="(max-width: 687px) 100vw, 687px" /></p>
<p>框架只有最合适的，没有最好的，需结合自己的系统业务去选择最合适的。</p>
<p>国内使用最多的框架是TP、laravel、CI。YII框架外企使用较多</p>
<h1>ThinkPHP5框架</h1>
<h2>下载TP5框架</h2>
<p>下载地址：<a href="/goto/rc3y" rel="nofollow">http://www.thinkphp.cn/down.html</a></p>
<p><img loading="lazy" decoding="async" width="671" height="101" class="wp-image-7399" src="/wp-content/uploads/2018/06/word-image-7.png" srcset="/wp-content/uploads/2018/06/word-image-7.png 671w, /wp-content/uploads/2018/06/word-image-7-300x45.png 300w" sizes="(max-width: 671px) 100vw, 671px" /></p>
<p><img loading="lazy" decoding="async" width="192" height="27" class="wp-image-7400" src="/wp-content/uploads/2018/06/word-image-8.png" /></p>
<h2>TP5框架的目录认识</h2>
<p>手册位置：基础&#8211;&gt;目录结构</p>
<ol>
<li>project 应用部署目录</li>
<li>├─application 应用目录（可设置）</li>
<li>│ ├─common 公共模块目录（可更改）</li>
<li>│ ├─index 模块目录(可更改)</li>
<li>│ │ ├─config.php 模块配置文件</li>
<li>│ │ ├─common.php 模块函数文件</li>
<li>│ │ ├─controller 控制器目录</li>
<li>│ │ ├─model 模型目录</li>
<li>│ │ ├─view 视图目录</li>
<li>│ │ └─ &#8230; 更多类库目录</li>
<li>│ ├─command.php 命令行工具配置文件</li>
<li>│ ├─common.php 应用公共（函数）文件</li>
<li>│ ├─config.php 应用（公共）配置文件</li>
<li>│ ├─database.php 数据库配置文件</li>
<li>│ ├─tags.php 应用行为扩展定义文件</li>
<li>│ └─route.php 路由配置文件</li>
<li>├─extend 扩展类库目录（可定义）</li>
<li>├─public WEB 部署目录（对外访问目录）</li>
<li>│ ├─static 静态资源存放目录(css,js,image)</li>
<li>│ ├─index.php 应用入口文件</li>
<li>│ ├─router.php 快速测试文件</li>
<li>│ └─.htaccess 用于 apache 的重写</li>
<li>├─runtime 应用的运行时目录（可写，可设置）</li>
<li>├─vendor 第三方类库目录（Composer）</li>
<li>├─thinkphp 框架系统目录</li>
<li>│ ├─lang 语言包目录</li>
<li>│ ├─library 框架核心类库目录</li>
<li>│ │ ├─think Think 类库包目录</li>
<li>│ │ └─traits 系统 Traits 目录</li>
<li>│ ├─tpl 系统模板目录</li>
<li>│ ├─.htaccess 用于 apache 的重写</li>
<li>│ ├─.travis.yml CI 定义文件</li>
<li>│ ├─base.php 基础定义文件</li>
<li>│ ├─composer.json composer 定义文件</li>
<li>│ ├─console.php 控制台入口文件</li>
<li>│ ├─convention.php 惯例配置文件</li>
<li>│ ├─helper.php 助手函数文件（可选）</li>
<li>│ ├─LICENSE.txt 授权说明文件</li>
<li>│ ├─phpunit.xml 单元测试配置文件</li>
<li>│ ├─README.md README 文件</li>
<li>│ └─start.php 框架引导文件</li>
<li>├─build.php 自动生成定义文件（参考）</li>
<li>├─composer.json composer 定义文件</li>
<li>├─LICENSE.txt 授权说明文件</li>
<li>├─README.md README 文件</li>
<li>├─think 命令行入口文件</li>
</ol>
<p>每个application下面的模块目录都有mvc分层结构：</p>
<p><img loading="lazy" decoding="async" width="380" height="187" class="wp-image-7401" src="/wp-content/uploads/2018/06/word-image-9.png" srcset="/wp-content/uploads/2018/06/word-image-9.png 380w, /wp-content/uploads/2018/06/word-image-9-300x148.png 300w" sizes="(max-width: 380px) 100vw, 380px" /></p>
<p>可参考手册：</p>
<p><img loading="lazy" decoding="async" width="979" height="138" class="wp-image-7402" src="/wp-content/uploads/2018/06/word-image-10.png" srcset="/wp-content/uploads/2018/06/word-image-10.png 979w, /wp-content/uploads/2018/06/word-image-10-300x42.png 300w, /wp-content/uploads/2018/06/word-image-10-768x108.png 768w" sizes="(max-width: 979px) 100vw, 979px" /></p>
<h1>三、使用TP5框架部署项目</h1>
<p>我们是使用ThinkPHP5+ajax+jquery以及和第三方插件结合起来，做一个文章管理系统，掌握怎样使用ThinkPHP5快速开发一个项目。</p>
<h2>配置项目虚拟主机</h2>
<p>主要三个核心步骤：1、使用phpStudy建立虚拟主机 2、设置hosts文件映射 3、重启apache服务器</p>
<p>把框架的文件复制到我们的虚拟主机目录中去：</p>
<p><img loading="lazy" decoding="async" width="652" height="417" class="wp-image-7403" src="/wp-content/uploads/2018/06/word-image-11.png" srcset="/wp-content/uploads/2018/06/word-image-11.png 652w, /wp-content/uploads/2018/06/word-image-11-300x192.png 300w" sizes="(max-width: 652px) 100vw, 652px" /></p>
<ol>
<li>使用phpStudy建立虚拟主机 (www.article.com)</li>
</ol>
<p><img loading="lazy" decoding="async" width="287" height="109" class="wp-image-7404" src="/wp-content/uploads/2018/06/word-image-12.png" /></p>
<p>最终生成的虚拟主机文件（vhosts.conf）配置如下：</p>
<p><img loading="lazy" decoding="async" width="488" height="206" class="wp-image-7405" src="/wp-content/uploads/2018/06/word-image-13.png" srcset="/wp-content/uploads/2018/06/word-image-13.png 488w, /wp-content/uploads/2018/06/word-image-13-300x127.png 300w" sizes="(max-width: 488px) 100vw, 488px" /></p>
<ol>
<li>设置hosts文件映射</li>
</ol>
<p><img loading="lazy" decoding="async" width="374" height="27" class="wp-image-7406" src="/wp-content/uploads/2018/06/word-image-14.png" srcset="/wp-content/uploads/2018/06/word-image-14.png 374w, /wp-content/uploads/2018/06/word-image-14-300x22.png 300w" sizes="(max-width: 374px) 100vw, 374px" /></p>
<ol>
<li>重启apache服务器</li>
</ol>
<h2>2、访问虚拟主机</h2>
<p>输入配置的域名直接访问：</p>
<p><img loading="lazy" decoding="async" width="806" height="368" class="wp-image-7407" src="/wp-content/uploads/2018/06/word-image-15.png" srcset="/wp-content/uploads/2018/06/word-image-15.png 806w, /wp-content/uploads/2018/06/word-image-15-300x137.png 300w, /wp-content/uploads/2018/06/word-image-15-768x351.png 768w" sizes="(max-width: 806px) 100vw, 806px" /></p>
<p>为什么会出现上面的一个笑脸？</p>
<p>答：那是因为受到框架的配置文件application/config.php的影响，默认访问index模块的index控制器的index方法，如下：</p>
<p><img loading="lazy" decoding="async" width="682" height="269" class="wp-image-7408" src="/wp-content/uploads/2018/06/word-image-16.png" srcset="/wp-content/uploads/2018/06/word-image-16.png 682w, /wp-content/uploads/2018/06/word-image-16-300x118.png 300w" sizes="(max-width: 682px) 100vw, 682px" /></p>
<p>可以对index控制器的index方法的内容进行更改：</p>
<p><img loading="lazy" decoding="async" width="668" height="231" class="wp-image-7409" src="/wp-content/uploads/2018/06/word-image-17.png" srcset="/wp-content/uploads/2018/06/word-image-17.png 668w, /wp-content/uploads/2018/06/word-image-17-300x104.png 300w" sizes="(max-width: 668px) 100vw, 668px" /></p>
<p>再次访问如下：</p>
<p><img loading="lazy" decoding="async" width="230" height="70" class="wp-image-7410" src="/wp-content/uploads/2018/06/word-image-18.png" /></p>
<p>注：tp5默认值支持老本tp3的pathinfo模式进行访问。</p>
<p>如：<a href="/goto/sbfh" rel="nofollow">http://域名/index.php/</a><a href="/goto/sbfh" rel="nofollow">模块/控制器/方法名</a><a href="/goto/sbfh" rel="nofollow">/参数1/值1/参数2/值2/</a></p>
<p>例：访问index模块的index 控制器的index方法</p>
<p>http://域名/index.php/index/index/index/参数1/值1/参数2/值2/</p>
<h2>3、响应输出</h2>
<p>控制器的所有操作方法都是return返回而不是直接输出，系统会调用Response::send方法将最终的应用返回的数据输出到页面或者客户端，并自动转换成default_return_type参数配置的格式。所以，应用执行的数据输出只需要返回一个正常的PHP数据即可。</p>
<p>tp5也是建议统一使用return返回数据，而不是echo输出，如非必要，请不要使用exit或者die中断执行。</p>
<p><img loading="lazy" decoding="async" width="509" height="59" class="wp-image-7411" src="/wp-content/uploads/2018/06/word-image-19.png" srcset="/wp-content/uploads/2018/06/word-image-19.png 509w, /wp-content/uploads/2018/06/word-image-19-300x35.png 300w" sizes="(max-width: 509px) 100vw, 509px" /></p>
<h1>四、控制器</h1>
<h2>控制器的作用</h2>
<p>C：Controller</p>
<p>作用：主要是接受用户的请求，在模型和视图之间起调度的作用。</p>
<h2>创建控制器</h2>
<h3>（1）修改控制器后缀</h3>
<p>由于国人命名的习惯，我们可以通过以下配置文件给控制器文件名加个Controller后缀。</p>
<p>打开配置文件，[项目目录]/application/config.php，做如下修改：</p>
<p><img loading="lazy" decoding="async" width="999" height="207" class="wp-image-7412" src="/wp-content/uploads/2018/06/word-image-20.png" srcset="/wp-content/uploads/2018/06/word-image-20.png 999w, /wp-content/uploads/2018/06/word-image-20-300x62.png 300w, /wp-content/uploads/2018/06/word-image-20-768x159.png 768w" sizes="(max-width: 999px) 100vw, 999px" /></p>
<h3>创建控制器语法</h3>
<p>语法规则：</p>
<p>控制器类名：控制器名+Controller</p>
<p>控制器文件名：控制器名+Controller.php</p>
<p>控制器文件所在路径：application/模块名/controller/</p>
<p>如在index模块下定义一个Test控制器：</p>
<p>控制器类名： TestController</p>
<p>控制器类文件名： TestController.php</p>
<p>文件定义位置：index/controller/TestController.php</p>
<p>注：类名首字母大写</p>
<p>代码如下：</p>
<p><img loading="lazy" decoding="async" width="683" height="298" class="wp-image-7413" src="/wp-content/uploads/2018/06/word-image-21.png" srcset="/wp-content/uploads/2018/06/word-image-21.png 683w, /wp-content/uploads/2018/06/word-image-21-300x131.png 300w" sizes="(max-width: 683px) 100vw, 683px" /></p>
<p>访问：</p>
<p><img loading="lazy" decoding="async" width="499" height="64" class="wp-image-7414" src="/wp-content/uploads/2018/06/word-image-22.png" srcset="/wp-content/uploads/2018/06/word-image-22.png 499w, /wp-content/uploads/2018/06/word-image-22-300x38.png 300w" sizes="(max-width: 499px) 100vw, 499px" /></p>
<h3>访问控制器</h3>
<p>1、可以通过tp3老版本的pathInfo模式进行访问。</p>
<p><a href="/goto/ghx2" rel="nofollow">http://网址/index.php/分组/控制器名称/操作方法名称</a></p>
<p>如访问Index模块的index控制器的test1方法</p>
<p><img loading="lazy" decoding="async" width="795" height="74" class="wp-image-7415" src="/wp-content/uploads/2018/06/word-image-23.png" srcset="/wp-content/uploads/2018/06/word-image-23.png 795w, /wp-content/uploads/2018/06/word-image-23-300x28.png 300w, /wp-content/uploads/2018/06/word-image-23-768x71.png 768w" sizes="(max-width: 795px) 100vw, 795px" /></p>
<p>2、也可以把index.php入口文件给隐藏掉，变为下边的路由形式：</p>
<p><a href="/goto/ghx2" rel="nofollow">http://网址/分组/控制器名称/操作方法名称</a></p>
<p>省去index.php入口访问，修改项目的重写文件.htaaccess。</p>
<p>第一步：文件位置：[项目根目录]/Public/.htaccess ,做如下修改：</p>
<p><img loading="lazy" decoding="async" width="514" height="211" class="wp-image-7416" src="/wp-content/uploads/2018/06/word-image-24.png" srcset="/wp-content/uploads/2018/06/word-image-24.png 514w, /wp-content/uploads/2018/06/word-image-24-300x123.png 300w" sizes="(max-width: 514px) 100vw, 514px" /></p>
<p>(注：上图在index.php后边加”?”号)</p>
<p>重写文件.htaccsee解释：</p>
<p>&lt;IfModule mod_rewrite.c&gt;</p>
<p>Options +FollowSymlinks -Multiviews</p>
<p>RewriteEngine On #开启重写规则</p>
<p>RewriteCond %{REQUEST_FILENAME} !-d #如果请求的不是一个目录（-d 代表目录）</p>
<p>RewriteCond %{REQUEST_FILENAME} !-f #且如果请求的不是一个文件（-f 代表文件）</p>
<p>RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] #上面两个条件都不满足，执行RewriteRule重写规则</p>
<p>&lt;/IfModule&gt;</p>
<p>重写规则: RewriteRule 虚拟规则（正则写） 服务器真实文件路径</p>
<p>即用户输入的域名后面的规则若满足虚拟规则，就会访问对应的真实文件。</p>
<p>第二步：修改虚拟主机vhosts.conf的配置：加上AllowOverride All ，默认phpstudy创建的虚拟主机自带这一行。</p>
<p><img loading="lazy" decoding="async" width="558" height="213" class="wp-image-7417" src="/wp-content/uploads/2018/06/word-image-25.png" srcset="/wp-content/uploads/2018/06/word-image-25.png 558w, /wp-content/uploads/2018/06/word-image-25-300x115.png 300w" sizes="(max-width: 558px) 100vw, 558px" /></p>
<p>第三步。再去httpd.conf开启重写文件：</p>
<p><img loading="lazy" decoding="async" width="747" height="169" class="wp-image-7418" src="/wp-content/uploads/2018/06/word-image-26.png" srcset="/wp-content/uploads/2018/06/word-image-26.png 747w, /wp-content/uploads/2018/06/word-image-26-300x68.png 300w" sizes="(max-width: 747px) 100vw, 747px" /></p>
<p>重启apache服务器，省去入口文件index.php进行访问:</p>
<p><img loading="lazy" decoding="async" width="352" height="74" class="wp-image-7419" src="/wp-content/uploads/2018/06/word-image-27.png" srcset="/wp-content/uploads/2018/06/word-image-27.png 352w, /wp-content/uploads/2018/06/word-image-27-300x63.png 300w" sizes="(max-width: 352px) 100vw, 352px" /></p>
<h3>开启调试模式</h3>
<p>为了在开发过程中，开发者能够及时看到详细的错误信息，我们在开发阶段可以把以下config配置文件中的app_debug配置设置为true,</p>
<p><img loading="lazy" decoding="async" width="700" height="173" class="wp-image-7420" src="/wp-content/uploads/2018/06/word-image-28.png" srcset="/wp-content/uploads/2018/06/word-image-28.png 700w, /wp-content/uploads/2018/06/word-image-28-300x74.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p>访问一个不存在的方法,会报详细的错误。</p>
<p><img loading="lazy" decoding="async" width="955" height="167" class="wp-image-7421" src="/wp-content/uploads/2018/06/word-image-29.png" srcset="/wp-content/uploads/2018/06/word-image-29.png 955w, /wp-content/uploads/2018/06/word-image-29-300x52.png 300w, /wp-content/uploads/2018/06/word-image-29-768x134.png 768w" sizes="(max-width: 955px) 100vw, 955px" /></p>
<p>若设置为false,则会出现友好的提示：</p>
<p><img loading="lazy" decoding="async" width="461" height="147" class="wp-image-7422" src="/wp-content/uploads/2018/06/word-image-30.png" srcset="/wp-content/uploads/2018/06/word-image-30.png 461w, /wp-content/uploads/2018/06/word-image-30-300x96.png 300w" sizes="(max-width: 461px) 100vw, 461px" /></p>
<p>所以，项目上线后，我们要把此配置改为false。不要让用户看到我们网站报错。</p>
<h1>五、项目分组（模块）</h1>
<h2>1、创建分组</h2>
<p>一个项目中一般都有Home、Admin分组，即前台和后台，那对应框架中就是一个具体的文件夹，每个项目文件夹都有对应的控制器、模型、视图对应的文件夹，tp5框架中默认有一个分组index。</p>
<p>我们只需要把index分组复制一份改名（如admin）放在Application目录下即可，同时修改对应类所在分组的命名空间即可。</p>
<p><img loading="lazy" decoding="async" width="689" height="231" class="wp-image-7423" src="/wp-content/uploads/2018/06/word-image-31.png" srcset="/wp-content/uploads/2018/06/word-image-31.png 689w, /wp-content/uploads/2018/06/word-image-31-300x101.png 300w" sizes="(max-width: 689px) 100vw, 689px" /></p>
<p>也需要改对应类的命名空间：</p>
<p><img loading="lazy" decoding="async" width="808" height="332" class="wp-image-7424" src="/wp-content/uploads/2018/06/word-image-32.png" srcset="/wp-content/uploads/2018/06/word-image-32.png 808w, /wp-content/uploads/2018/06/word-image-32-300x123.png 300w, /wp-content/uploads/2018/06/word-image-32-768x316.png 768w" sizes="(max-width: 808px) 100vw, 808px" /></p>
<p>访问如下：</p>
<p><img loading="lazy" decoding="async" width="454" height="64" class="wp-image-7425" src="/wp-content/uploads/2018/06/word-image-33.png" srcset="/wp-content/uploads/2018/06/word-image-33.png 454w, /wp-content/uploads/2018/06/word-image-33-300x42.png 300w" sizes="(max-width: 454px) 100vw, 454px" /></p>
<h2>2、默认分组的设置</h2>
<p>需修改框架的application/config.php的配置文件，如默认访问admin分组的index控制器的index方法，做如下修改：</p>
<p><img loading="lazy" decoding="async" width="834" height="301" class="wp-image-7426" src="/wp-content/uploads/2018/06/word-image-34.png" srcset="/wp-content/uploads/2018/06/word-image-34.png 834w, /wp-content/uploads/2018/06/word-image-34-300x108.png 300w, /wp-content/uploads/2018/06/word-image-34-768x277.png 768w" sizes="(max-width: 834px) 100vw, 834px" /></p>
<p>直接输入域名访问的则是admin模块下的index控制器的index方法：</p>
<p><img loading="lazy" decoding="async" width="416" height="103" class="wp-image-7427" src="/wp-content/uploads/2018/06/word-image-35.png" srcset="/wp-content/uploads/2018/06/word-image-35.png 416w, /wp-content/uploads/2018/06/word-image-35-300x74.png 300w" sizes="(max-width: 416px) 100vw, 416px" /></p>
<h2>3、分组的访问权限控制</h2>
<p>需修改框架的application/config.php的配置文件：</p>
<p><img loading="lazy" decoding="async" width="612" height="78" class="wp-image-7428" src="/wp-content/uploads/2018/06/word-image-36.png" srcset="/wp-content/uploads/2018/06/word-image-36.png 612w, /wp-content/uploads/2018/06/word-image-36-300x38.png 300w" sizes="(max-width: 612px) 100vw, 612px" /></p>
<p>上图是设置禁止访问common和index分组。</p>
<p>再次访问index模块，会报错。</p>
<p><img loading="lazy" decoding="async" width="625" height="210" class="wp-image-7429" src="/wp-content/uploads/2018/06/word-image-37.png" srcset="/wp-content/uploads/2018/06/word-image-37.png 625w, /wp-content/uploads/2018/06/word-image-37-300x101.png 300w" sizes="(max-width: 625px) 100vw, 625px" /></p>
<h1>六、【了解】命令行操作</h1>
<h2>命令行创建分组</h2>
<p>创建文件application/build.php并填充内容，可以参考根目录 build.php</p>
<p>[项目根目录] &gt; php think build</p>
<p>创建application/build.php并填充如下内容：</p>
<p><img loading="lazy" decoding="async" width="1209" height="397" class="wp-image-7430" src="/wp-content/uploads/2018/06/word-image-38.png" srcset="/wp-content/uploads/2018/06/word-image-38.png 1209w, /wp-content/uploads/2018/06/word-image-38-300x99.png 300w, /wp-content/uploads/2018/06/word-image-38-768x252.png 768w, /wp-content/uploads/2018/06/word-image-38-1024x336.png 1024w" sizes="(max-width: 1209px) 100vw, 1209px" /></p>
<p>执行命令</p>
<p><img loading="lazy" decoding="async" width="365" height="79" class="wp-image-7431" src="/wp-content/uploads/2018/06/word-image-39.png" srcset="/wp-content/uploads/2018/06/word-image-39.png 365w, /wp-content/uploads/2018/06/word-image-39-300x65.png 300w" sizes="(max-width: 365px) 100vw, 365px" /></p>
<p>创建分组的效果</p>
<h2>命令行创建控制器</h2>
<p>[项目根目录] &gt; php think make:controller 分组/名称</p>
<p>注：不写分组名会直接创建在common分组中</p>
<p>例：在Common中生成一个Demo的控制器</p>
<p><img loading="lazy" decoding="async" width="433" height="44" class="wp-image-7432" src="/wp-content/uploads/2018/06/word-image-40.png" srcset="/wp-content/uploads/2018/06/word-image-40.png 433w, /wp-content/uploads/2018/06/word-image-40-300x30.png 300w" sizes="(max-width: 433px) 100vw, 433px" /></p>
<p>生成如下所示：</p>
<p><img loading="lazy" decoding="async" width="881" height="331" class="wp-image-7433" src="/wp-content/uploads/2018/06/word-image-41.png" srcset="/wp-content/uploads/2018/06/word-image-41.png 881w, /wp-content/uploads/2018/06/word-image-41-300x113.png 300w, /wp-content/uploads/2018/06/word-image-41-768x289.png 768w" sizes="(max-width: 881px) 100vw, 881px" /></p>
<p>例如下述，要给index分组创建UserController.php控制器文件</p>
<p>[项目根目录] &gt; php think make:controller index/User</p>
<p>命令如下；</p>
<p><img loading="lazy" decoding="async" width="494" height="48" class="wp-image-7434" src="/wp-content/uploads/2018/06/word-image-42.png" srcset="/wp-content/uploads/2018/06/word-image-42.png 494w, /wp-content/uploads/2018/06/word-image-42-300x29.png 300w" sizes="(max-width: 494px) 100vw, 494px" /></p>
<p>生成的文件：</p>
<p><img loading="lazy" decoding="async" width="817" height="341" class="wp-image-7435" src="/wp-content/uploads/2018/06/word-image-43.png" srcset="/wp-content/uploads/2018/06/word-image-43.png 817w, /wp-content/uploads/2018/06/word-image-43-300x125.png 300w, /wp-content/uploads/2018/06/word-image-43-768x321.png 768w" sizes="(max-width: 817px) 100vw, 817px" /></p>
<h1>七、使用路由访问</h1>
<p>老版本TP3.2多种访问模式（了解）：</p>
<ul>
<li>pathinfo模式（默认形式,,重点掌握）：http://域名/index.php/模块/控制器名/方法名/参数名/参数值/参数名/参数值&#8230;</li>
</ul>
<p><img loading="lazy" decoding="async" width="578" height="38" class="wp-image-7436" src="/wp-content/uploads/2018/06/word-image-44.png" srcset="/wp-content/uploads/2018/06/word-image-44.png 578w, /wp-content/uploads/2018/06/word-image-44-300x20.png 300w" sizes="(max-width: 578px) 100vw, 578px" /></p>
<ul>
<li>普通模式（get形式）：http://域名/index.php?m=模块&amp;c=控制器名&amp;a=方法名&amp;参数名=参数值&#8230;</li>
</ul>
<p><img loading="lazy" decoding="async" width="605" height="79" class="wp-image-7437" src="/wp-content/uploads/2018/06/word-image-45.png" srcset="/wp-content/uploads/2018/06/word-image-45.png 605w, /wp-content/uploads/2018/06/word-image-45-300x39.png 300w" sizes="(max-width: 605px) 100vw, 605px" /></p>
<ul>
<li>rewrite模式（隐藏入口文件）：<a href="/goto/98sz" rel="nofollow">http://域名/模块/控制器名/方法名/参数名/参数值/参数名/参数值&#8230;</a></li>
</ul>
<p><img loading="lazy" decoding="async" width="515" height="82" class="wp-image-7438" src="/wp-content/uploads/2018/06/word-image-46.png" srcset="/wp-content/uploads/2018/06/word-image-46.png 515w, /wp-content/uploads/2018/06/word-image-46-300x48.png 300w" sizes="(max-width: 515px) 100vw, 515px" /></p>
<ul>
<li>兼容模式：http://域名/inde.php?s=/模块/控制器名/方法名/参数名/参数值&#8230;</li>
</ul>
<p><img loading="lazy" decoding="async" width="534" height="83" class="wp-image-7439" src="/wp-content/uploads/2018/06/word-image-47.png" srcset="/wp-content/uploads/2018/06/word-image-47.png 534w, /wp-content/uploads/2018/06/word-image-47-300x47.png 300w" sizes="(max-width: 534px) 100vw, 534px" /></p>
<p>上面的四种模式在tp5默认都是支持的。其在tp5框架中还可以单独定义路由规则来访问某个控制器中的某个方法。</p>
<p>只要配置文件config.php中开启路由功能，访问的时候就会经过路由规则，根据定义的路由规则从而访问到某个控制器中的方法。</p>
<p>路由图解：</p>
<p><img loading="lazy" decoding="async" width="697" height="91" class="wp-image-7440" src="/wp-content/uploads/2018/06/word-image-48.png" srcset="/wp-content/uploads/2018/06/word-image-48.png 697w, /wp-content/uploads/2018/06/word-image-48-300x39.png 300w" sizes="(max-width: 697px) 100vw, 697px" /></p>
<ol>
<li>开启路由，修改application/config.php配置文件</li>
</ol>
<p>&#8216;url_route_on&#8217; =&gt; true, // 开启路由</p>
<p>&#8216;url_route_must&#8217; =&gt; true, // 必须使用路由(即不能使用之前的pathinfo模式访问)</p>
<p>注：若url_route_must设置为true,就不就可以通过上面四种模式来访问，只能通过定义的路由规则访问。</p>
<p>2、定义路由规则，定义在application/route.php文件中</p>
<p>Route::rule(&#8216;路由表达式&#8217;,&#8217;路由地址&#8217;,&#8217;请求类型&#8217;,&#8217;路由参数(数组)&#8217;,&#8217;变量规则(数组)&#8217;);</p>
<p>说明：</p>
<p><strong>路由表达式</strong>：静态地址、动态地址、可选动态地址</p>
<p><strong>路由地址</strong>：表示路由表达式最终需要路由到的地址，有多种定义方式，常用的是”模块/控制器/操作?额外参数1=值1&amp;额外参数2=值2”形式</p>
<p><strong>请求类型</strong>：GET、POST 必须是大写的</p>
<p><strong>路由参数</strong>：</p>
<p>method:请求类型</p>
<p>ext:允许的后缀</p>
<p>deny_ext:禁止的访问后缀</p>
<p>domain:允许什么样的域名访问有效</p>
<p>https:检测是否是https请求</p>
<p>before_behavior:行为发生前，进行路由检查</p>
<p>after_behavior:行为发生后，要执行的动作</p>
<p>&#8230;</p>
<p>详情参考：手册路由&#8211;&gt;路由参数</p>
<p>变量规则：检查传递的变量是否符合某个(正则)规则,规则可以通过正则定义</p>
<p>例如规则：</p>
<p>Route::rule(‘login’,’home/User/login’,’GET’,[‘ext’=&gt;’html’]);</p>
<p>访问：<a href="/goto/dzl6" rel="nofollow">http://servername/index.php/login</a>.html</p>
<p>路由到：<a href="/goto/5h9l" rel="nofollow">http://servername/index.php/home/User/login</a></p>
<p>Route::rule(‘login/:id’,’home/User/login’,’GET’,[‘ext’=&gt;’html’],[‘id’=&gt;’\d+’]);</p>
<p>访问：<a href="/goto/dzl6" rel="nofollow">http://servername/index.php/login</a>/101.html</p>
<p>路由到：<a href="/goto/5h9l" rel="nofollow">http://servername/index.php/home/User/login</a>/id/101</p>
<p>Route::rule(‘login/:id/:name’,’home/User/login’,’GET’,[‘ext’=&gt;’html’],[‘id’=&gt;’\d+’,’name’=&gt;’[a-zA-Z]+’]);</p>
<p>访问：<a href="/goto/dzl6" rel="nofollow">http://servername/index.php/login</a>/101/tom.html</p>
<p>路由到：</p>
<p><a href="/goto/5h9l" rel="nofollow">http://servername/index.php/home/User/login</a>/id/101/name/tom</p>
<p>也可以像下边这样定义:</p>
<p>Route::get(&#8216;路由表达式&#8217;,&#8217;路由地址&#8217;,&#8217;路由参数(数组)&#8217;,&#8217;变量规则(数组)&#8217;);</p>
<p>Route::post(&#8216;路由表达式&#8217;,&#8217;路由地址&#8217;,&#8217;路由参数(数组)&#8217;,&#8217;变量规则(数组)&#8217;);</p>
<p>如一个控制器中的方法在路由规则中没有定义则是不允许被访问，报以下错误：</p>
<p><img loading="lazy" decoding="async" width="701" height="144" class="wp-image-7441" src="/wp-content/uploads/2018/06/word-image-49.png" srcset="/wp-content/uploads/2018/06/word-image-49.png 701w, /wp-content/uploads/2018/06/word-image-49-300x62.png 300w" sizes="(max-width: 701px) 100vw, 701px" /></p>
<p>解决办法，把application/config.php文件中的以下配置改为false,就说明路由规则和pathinfo形式两者都可以进行访问。</p>
<p>&#8216;url_route_must&#8217; =&gt; false, // 是否强制使用路由</p>
<p>在application/route.php中定义路由规则：</p>
<p><img loading="lazy" decoding="async" width="1171" height="392" class="wp-image-7442" src="/wp-content/uploads/2018/06/word-image-50.png" srcset="/wp-content/uploads/2018/06/word-image-50.png 1171w, /wp-content/uploads/2018/06/word-image-50-300x100.png 300w, /wp-content/uploads/2018/06/word-image-50-768x257.png 768w, /wp-content/uploads/2018/06/word-image-50-1024x343.png 1024w" sizes="(max-width: 1171px) 100vw, 1171px" /></p>
<p>访问如下：</p>
<p><img loading="lazy" decoding="async" width="323" height="71" class="wp-image-7443" src="/wp-content/uploads/2018/06/word-image-51.png" srcset="/wp-content/uploads/2018/06/word-image-51.png 323w, /wp-content/uploads/2018/06/word-image-51-300x66.png 300w" sizes="(max-width: 323px) 100vw, 323px" /></p>
<p><img loading="lazy" decoding="async" width="328" height="64" class="wp-image-7444" src="/wp-content/uploads/2018/06/word-image-52.png" srcset="/wp-content/uploads/2018/06/word-image-52.png 328w, /wp-content/uploads/2018/06/word-image-52-300x59.png 300w" sizes="(max-width: 328px) 100vw, 328px" /></p>
<p><img loading="lazy" decoding="async" width="317" height="66" class="wp-image-7445" src="/wp-content/uploads/2018/06/word-image-53.png" srcset="/wp-content/uploads/2018/06/word-image-53.png 317w, /wp-content/uploads/2018/06/word-image-53-300x62.png 300w" sizes="(max-width: 317px) 100vw, 317px" /></p>
<h1>展示视图</h1>
<p>语法：控制器中调用fetch方法</p>
<p>return $this -&gt; fetch(模块@控制器/操作);</p>
<p>注意：</p>
<p>控制器要想正常调用fetch方法，则必须继承Controller类：use think\Controller</p>
<p>fetch()具体有下述5种用法：</p>
<ul>
<li>调用：view下当前控制器名/当前操作名.html模版文件</li>
</ul>
<p>return $this -&gt; fetch();</p>
<ul>
<li>调用：view下当前控制器的/add.html模版文件</li>
</ul>
<p>return $this -&gt; fetch(‘add’);</p>
<ul>
<li>找到view下边user目录的login.html模版文件[跨控制器]</li>
</ul>
<p>return $this -&gt; fetch(&#8216;user/login&#8217;);</p>
<ul>
<li>找到admin分组view目录的manager下边的login.html模版文件[跨分组]</li>
</ul>
<p>return $this -&gt; fetch(&#8216;admin@manager/login&#8217;);</p>
<p>代码如下：</p>
<p><img loading="lazy" decoding="async" width="879" height="322" class="wp-image-7446" src="/wp-content/uploads/2018/06/word-image-54.png" srcset="/wp-content/uploads/2018/06/word-image-54.png 879w, /wp-content/uploads/2018/06/word-image-54-300x110.png 300w, /wp-content/uploads/2018/06/word-image-54-768x281.png 768w" sizes="(max-width: 879px) 100vw, 879px" /></p>
<p>结果：</p>
<p><img loading="lazy" decoding="async" width="428" height="86" class="wp-image-7447" src="/wp-content/uploads/2018/06/word-image-55.png" srcset="/wp-content/uploads/2018/06/word-image-55.png 428w, /wp-content/uploads/2018/06/word-image-55-300x60.png 300w" sizes="(max-width: 428px) 100vw, 428px" /></p>
<h1>九、模板赋值</h1>
<p>语法：在控制器调用assign方法</p>
<ol>
<li>public function index()</li>
<li>{</li>
<li>// 模板变量赋值</li>
<li>$this-&gt;assign(&#8216;name&#8217;,&#8217;ThinkPHP&#8217;);</li>
<li>$this-&gt;assign(&#8217;email&#8217;,&#8217;thinkphp@qq.com&#8217;);</li>
<li>// 或者批量赋值</li>
<li>$this-&gt;assign([</li>
<li>&#8216;name&#8217; =&gt; &#8216;ThinkPHP&#8217;,</li>
<li>&#8217;email&#8217; =&gt; &#8216;thinkphp@qq.com&#8217;</li>
<li>]);</li>
<li>// 模板输出</li>
<li>return $this-&gt;fetch(&#8216;index&#8217;);</li>
<li>}</li>
</ol>
<p>或者把模板变量直接传递给fetch方法：</p>
<ol>
<li>public function index()</li>
<li>{</li>
<li>return $this-&gt;fetch(&#8216;index&#8217;, [</li>
<li>&#8216;name&#8217; =&gt; &#8216;ThinkPHP&#8217;,</li>
<li>&#8217;email&#8217; =&gt; &#8216;thinkphp@qq.com&#8217;</li>
<li>]);</li>
<li>}</li>
</ol>
<p>代码如下：</p>
<p><img loading="lazy" decoding="async" width="611" height="174" class="wp-image-7448" src="/wp-content/uploads/2018/06/word-image-56.png" srcset="/wp-content/uploads/2018/06/word-image-56.png 611w, /wp-content/uploads/2018/06/word-image-56-300x85.png 300w" sizes="(max-width: 611px) 100vw, 611px" /></p>
<p>模板中显示：</p>
<p><img loading="lazy" decoding="async" width="392" height="94" class="wp-image-7449" src="/wp-content/uploads/2018/06/word-image-57.png" srcset="/wp-content/uploads/2018/06/word-image-57.png 392w, /wp-content/uploads/2018/06/word-image-57-300x72.png 300w" sizes="(max-width: 392px) 100vw, 392px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="414" height="132" class="wp-image-7450" src="/wp-content/uploads/2018/06/word-image-58.png" srcset="/wp-content/uploads/2018/06/word-image-58.png 414w, /wp-content/uploads/2018/06/word-image-58-300x96.png 300w" sizes="(max-width: 414px) 100vw, 414px" /></p>
<p>建议使用如下方式，分配模板变量：<br />
<img loading="lazy" decoding="async" width="735" height="212" class="wp-image-7451" src="/wp-content/uploads/2018/06/word-image-59.png" srcset="/wp-content/uploads/2018/06/word-image-59.png 735w, /wp-content/uploads/2018/06/word-image-59-300x87.png 300w" sizes="(max-width: 735px) 100vw, 735px" /></p>
<p>模板中显示：</p>
<p><img loading="lazy" decoding="async" width="630" height="265" class="wp-image-7452" src="/wp-content/uploads/2018/06/word-image-60.png" srcset="/wp-content/uploads/2018/06/word-image-60.png 630w, /wp-content/uploads/2018/06/word-image-60-300x126.png 300w" sizes="(max-width: 630px) 100vw, 630px" /></p>
<h1>十、模板常用标签</h1>
<h2>volist标签</h2>
<p>作用：主要用来遍历数组</p>
<p>语法：</p>
<p><img loading="lazy" decoding="async" width="966" height="275" class="wp-image-7453" src="/wp-content/uploads/2018/06/word-image-61.png" srcset="/wp-content/uploads/2018/06/word-image-61.png 966w, /wp-content/uploads/2018/06/word-image-61-300x85.png 300w, /wp-content/uploads/2018/06/word-image-61-768x219.png 768w" sizes="(max-width: 966px) 100vw, 966px" /></p>
<p>Volist标签的name属性表示模板赋值的变量名称，因此不可随意在模板文件中改变。id表示当前的循环变量，可以随意指定，但确保不要和name属性值冲突。</p>
<p>代码如下：</p>
<p>控制器对模板赋值：</p>
<p><img loading="lazy" decoding="async" width="706" height="394" class="wp-image-7454" src="/wp-content/uploads/2018/06/word-image-62.png" srcset="/wp-content/uploads/2018/06/word-image-62.png 706w, /wp-content/uploads/2018/06/word-image-62-300x167.png 300w" sizes="(max-width: 706px) 100vw, 706px" /></p>
<p>模板遍历：</p>
<p><img loading="lazy" decoding="async" width="802" height="375" class="wp-image-7455" src="/wp-content/uploads/2018/06/word-image-63.png" srcset="/wp-content/uploads/2018/06/word-image-63.png 802w, /wp-content/uploads/2018/06/word-image-63-300x140.png 300w, /wp-content/uploads/2018/06/word-image-63-768x359.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></p>
<p>效果：<br />
<img loading="lazy" decoding="async" width="448" height="272" class="wp-image-7456" src="/wp-content/uploads/2018/06/word-image-64.png" srcset="/wp-content/uploads/2018/06/word-image-64.png 448w, /wp-content/uploads/2018/06/word-image-64-300x182.png 300w" sizes="(max-width: 448px) 100vw, 448px" /></p>
<p>循环数组序号（标号）：</p>
<p><img loading="lazy" decoding="async" width="809" height="253" class="wp-image-7457" src="/wp-content/uploads/2018/06/word-image-65.png" srcset="/wp-content/uploads/2018/06/word-image-65.png 809w, /wp-content/uploads/2018/06/word-image-65-300x94.png 300w, /wp-content/uploads/2018/06/word-image-65-768x240.png 768w" sizes="(max-width: 809px) 100vw, 809px" /></p>
<p>注：如果不知道key属性，默认{$key}从0开始，所以需要加1{$key+1}</p>
<h2>比较标签</h2>
<p>参考手册：</p>
<p><img loading="lazy" decoding="async" width="788" height="449" class="wp-image-7458" src="/wp-content/uploads/2018/06/word-image-66.png" srcset="/wp-content/uploads/2018/06/word-image-66.png 788w, /wp-content/uploads/2018/06/word-image-66-300x171.png 300w, /wp-content/uploads/2018/06/word-image-66-768x438.png 768w" sizes="(max-width: 788px) 100vw, 788px" /></p>
<p>使用范例：</p>
<p><img loading="lazy" decoding="async" width="387" height="123" class="wp-image-7459" src="/wp-content/uploads/2018/06/word-image-67.png" srcset="/wp-content/uploads/2018/06/word-image-67.png 387w, /wp-content/uploads/2018/06/word-image-67-300x95.png 300w" sizes="(max-width: 387px) 100vw, 387px" /></p>
<p>代码如下：</p>
<p>模板赋值遍历：</p>
<p><img loading="lazy" decoding="async" width="600" height="50" class="wp-image-7460" src="/wp-content/uploads/2018/06/word-image-68.png" srcset="/wp-content/uploads/2018/06/word-image-68.png 600w, /wp-content/uploads/2018/06/word-image-68-300x25.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></p>
<p>模板判断：</p>
<p><img loading="lazy" decoding="async" width="326" height="146" class="wp-image-7461" src="/wp-content/uploads/2018/06/word-image-69.png" srcset="/wp-content/uploads/2018/06/word-image-69.png 326w, /wp-content/uploads/2018/06/word-image-69-300x134.png 300w" sizes="(max-width: 326px) 100vw, 326px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="165" height="83" class="wp-image-7462" src="/wp-content/uploads/2018/06/word-image-70.png" /></p>
<h2>php标签</h2>
<p>如果模板标签太多记不住，这里可以使用php标签统一进行一些代码的编写：</p>
<p><img loading="lazy" decoding="async" width="716" height="258" class="wp-image-7463" src="/wp-content/uploads/2018/06/word-image-71.png" srcset="/wp-content/uploads/2018/06/word-image-71.png 716w, /wp-content/uploads/2018/06/word-image-71-300x108.png 300w" sizes="(max-width: 716px) 100vw, 716px" /></p>
<p>例1：代码如下：</p>
<p><img loading="lazy" decoding="async" width="885" height="546" class="wp-image-7464" src="/wp-content/uploads/2018/06/word-image-72.png" srcset="/wp-content/uploads/2018/06/word-image-72.png 885w, /wp-content/uploads/2018/06/word-image-72-300x185.png 300w, /wp-content/uploads/2018/06/word-image-72-768x474.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></p>
<p>例2：代码如下：</p>
<p>控制器赋值：</p>
<p><img loading="lazy" decoding="async" width="512" height="63" class="wp-image-7465" src="/wp-content/uploads/2018/06/word-image-73.png" srcset="/wp-content/uploads/2018/06/word-image-73.png 512w, /wp-content/uploads/2018/06/word-image-73-300x37.png 300w" sizes="(max-width: 512px) 100vw, 512px" /></p>
<p>模板获取：</p>
<p><img loading="lazy" decoding="async" width="549" height="191" class="wp-image-7466" src="/wp-content/uploads/2018/06/word-image-74.png" srcset="/wp-content/uploads/2018/06/word-image-74.png 549w, /wp-content/uploads/2018/06/word-image-74-300x104.png 300w" sizes="(max-width: 549px) 100vw, 549px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="100" height="77" class="wp-image-7467" src="/wp-content/uploads/2018/06/word-image-75.png" /></p>
<h2>include包含标签</h2>
<p><strong>作用</strong>：</p>
<p>一般网站页面的头部或尾部的网页效果都是一样的，我们就可以把这些网页的代码抽离出来放在一个html文件中，需要使用这些文件的时候，在模板中用include标签引入即可，从而提高代码的复用性。</p>
<p><strong>include语法：</strong></p>
<p><img loading="lazy" decoding="async" width="482" height="57" class="wp-image-7468" src="/wp-content/uploads/2018/06/word-image-76.png" srcset="/wp-content/uploads/2018/06/word-image-76.png 482w, /wp-content/uploads/2018/06/word-image-76-300x35.png 300w" sizes="(max-width: 482px) 100vw, 482px" /></p>
<p>注意：file的路径是从当前模块的view目录下开始找起。</p>
<p>如：有一个header.html模板，其所在路径为：Admin/view/public/header.html</p>
<p>在模板中引入此文件： &lt;include file=”public/header” /&gt;</p>
<p><strong>代码如下：</strong></p>
<p>控制器输出模板：</p>
<p><img loading="lazy" decoding="async" width="567" height="202" class="wp-image-7469" src="/wp-content/uploads/2018/06/word-image-77.png" srcset="/wp-content/uploads/2018/06/word-image-77.png 567w, /wp-content/uploads/2018/06/word-image-77-300x107.png 300w" sizes="(max-width: 567px) 100vw, 567px" /></p>
<p>在模板中引入公共的文件：</p>
<p><img loading="lazy" decoding="async" width="1019" height="353" class="wp-image-7470" src="/wp-content/uploads/2018/06/word-image-78.png" srcset="/wp-content/uploads/2018/06/word-image-78.png 1019w, /wp-content/uploads/2018/06/word-image-78-300x104.png 300w, /wp-content/uploads/2018/06/word-image-78-768x266.png 768w" sizes="(max-width: 1019px) 100vw, 1019px" /></p>
<p>注：文件名后缀不要加html</p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="136" height="66" class="wp-image-7471" src="/wp-content/uploads/2018/06/word-image-79.png" /></p>
<h1>十一、搭建后台首页</h1>
<p>第一步：在后台Admin建立一个Index的控制器，输出模板内容</p>
<p><img loading="lazy" decoding="async" width="885" height="275" class="wp-image-7472" src="/wp-content/uploads/2018/06/word-image-80.png" srcset="/wp-content/uploads/2018/06/word-image-80.png 885w, /wp-content/uploads/2018/06/word-image-80-300x93.png 300w, /wp-content/uploads/2018/06/word-image-80-768x239.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></p>
<p>第二步：把我们的后台模板index.html复制到/admin/view/index/目录下面</p>
<p><img loading="lazy" decoding="async" width="1028" height="383" class="wp-image-7473" src="/wp-content/uploads/2018/06/word-image-81.png" srcset="/wp-content/uploads/2018/06/word-image-81.png 1028w, /wp-content/uploads/2018/06/word-image-81-300x112.png 300w, /wp-content/uploads/2018/06/word-image-81-768x286.png 768w, /wp-content/uploads/2018/06/word-image-81-1024x382.png 1024w" sizes="(max-width: 1028px) 100vw, 1028px" /></p>
<p>第三步：把后台模板的left.html 、 top.html 、main.html复复制到/admin/view/index/目录下面.</p>
<p><img loading="lazy" decoding="async" width="744" height="472" class="wp-image-7474" src="/wp-content/uploads/2018/06/word-image-82.png" srcset="/wp-content/uploads/2018/06/word-image-82.png 744w, /wp-content/uploads/2018/06/word-image-82-300x190.png 300w" sizes="(max-width: 744px) 100vw, 744px" /></p>
<p>第四步：在建立left、top、main三个方法</p>
<p><img loading="lazy" decoding="async" width="835" height="533" class="wp-image-7475" src="/wp-content/uploads/2018/06/word-image-83.png" srcset="/wp-content/uploads/2018/06/word-image-83.png 835w, /wp-content/uploads/2018/06/word-image-83-300x191.png 300w, /wp-content/uploads/2018/06/word-image-83-768x490.png 768w" sizes="(max-width: 835px) 100vw, 835px" /></p>
<p>第五步：设置index.html模板的iframe的src路径：</p>
<p><img loading="lazy" decoding="async" width="1238" height="324" class="wp-image-7476" src="/wp-content/uploads/2018/06/word-image-84.png" srcset="/wp-content/uploads/2018/06/word-image-84.png 1238w, /wp-content/uploads/2018/06/word-image-84-300x79.png 300w, /wp-content/uploads/2018/06/word-image-84-768x201.png 768w, /wp-content/uploads/2018/06/word-image-84-1024x268.png 1024w" sizes="(max-width: 1238px) 100vw, 1238px" /></p>
<p>注：助手函数：url(‘模块/控制器/方法’) 生成url地址，在模板中使用函数需要在一对花括号{}前面加个冒号：</p>
<p>第六步：把后台资源（img、css、js）,复制到网站根目录public/admin/目录下面</p>
<p><img loading="lazy" decoding="async" width="1062" height="209" class="wp-image-7477" src="/wp-content/uploads/2018/06/word-image-85.png" srcset="/wp-content/uploads/2018/06/word-image-85.png 1062w, /wp-content/uploads/2018/06/word-image-85-300x59.png 300w, /wp-content/uploads/2018/06/word-image-85-768x151.png 768w, /wp-content/uploads/2018/06/word-image-85-1024x202.png 1024w" sizes="(max-width: 1062px) 100vw, 1062px" /></p>
<p>同时config.php配置文件中，定义一个后台资源目录的路径，在模板中进行统一替换：</p>
<p><img loading="lazy" decoding="async" width="860" height="300" class="wp-image-7478" src="/wp-content/uploads/2018/06/word-image-86.png" srcset="/wp-content/uploads/2018/06/word-image-86.png 860w, /wp-content/uploads/2018/06/word-image-86-300x105.png 300w, /wp-content/uploads/2018/06/word-image-86-768x268.png 768w" sizes="(max-width: 860px) 100vw, 860px" /></p>
<p>第七步：模板中替换使用config函数获取配置进行替换：</p>
<p><img loading="lazy" decoding="async" width="1358" height="710" class="wp-image-7479" src="/wp-content/uploads/2018/06/word-image-87.png" srcset="/wp-content/uploads/2018/06/word-image-87.png 1358w, /wp-content/uploads/2018/06/word-image-87-300x157.png 300w, /wp-content/uploads/2018/06/word-image-87-768x402.png 768w, /wp-content/uploads/2018/06/word-image-87-1024x535.png 1024w" sizes="(max-width: 1358px) 100vw, 1358px" /></p>
<p>和上面操作一样分别替换top.html、left.html、main.html的静态资源目录。</p>
<p>最终效果：</p>
<p><img loading="lazy" decoding="async" width="761" height="479" class="wp-image-7480" src="/wp-content/uploads/2018/06/word-image-88.png" srcset="/wp-content/uploads/2018/06/word-image-88.png 761w, /wp-content/uploads/2018/06/word-image-88-300x189.png 300w" sizes="(max-width: 761px) 100vw, 761px" /></p>
<p>注：助手函数config(‘配置名’)，是获取配置文件中的值。模板中使用需要在{}前面加个冒号：。</p>
<p>助手函数手册位置：附录&#8211;》助手函数</p>
<h1>十二、搭建登录页</h1>
<p>第一步：在后台admin建立一个Public控制器，并建立一个login的方法，输出模板内容</p>
<p><img loading="lazy" decoding="async" width="815" height="262" class="wp-image-7482" src="/wp-content/uploads/2018/06/word-image-89.png" srcset="/wp-content/uploads/2018/06/word-image-89.png 815w, /wp-content/uploads/2018/06/word-image-89-300x96.png 300w, /wp-content/uploads/2018/06/word-image-89-768x247.png 768w" sizes="(max-width: 815px) 100vw, 815px" /></p>
<p>第二步：把后台模板login.html赋值到/admin/view/public/目录下面，并替换静态资源文件路径</p>
<p><img loading="lazy" decoding="async" width="1221" height="368" class="wp-image-7483" src="/wp-content/uploads/2018/06/word-image-90.png" srcset="/wp-content/uploads/2018/06/word-image-90.png 1221w, /wp-content/uploads/2018/06/word-image-90-300x90.png 300w, /wp-content/uploads/2018/06/word-image-90-768x231.png 768w, /wp-content/uploads/2018/06/word-image-90-1024x309.png 1024w" sizes="(max-width: 1221px) 100vw, 1221px" /></p>
<p>效果：<br />
<img loading="lazy" decoding="async" width="775" height="341" class="wp-image-7484" src="/wp-content/uploads/2018/06/word-image-91.png" srcset="/wp-content/uploads/2018/06/word-image-91.png 775w, /wp-content/uploads/2018/06/word-image-91-300x132.png 300w, /wp-content/uploads/2018/06/word-image-91-768x338.png 768w" sizes="(max-width: 775px) 100vw, 775px" /></p>
<p>sublime快捷键：</p>
<p>替换：ctrl+h</p>
<p>找文件：ctrl+p</p>
<h1>十三、控制器中的页面跳转和重定向</h1>
<h2>1、跳转</h2>
<p>在应用开发中，经常会遇到一些带有提示信息的跳转页面，例如操作成功或者操作错误页面，并且自动跳转到另外一个目标页面。系统的\think\Controller类内置了两个跳转方法success和error，用于页面跳转提示</p>
<p>成功跳转：$this-&gt;success($msg,$url,$data,$time)</p>
<p>失败跳转：$this-&gt;error($msg,$url,$data,$time))</p>
<p>参数说明：</p>
<ul>
<li>msg:跳转的提示信息</li>
<li>url:跳转的地址。 建议用助手函数url()生成地址。，失败默认跳回上一页。一般不需要指定</li>
<li>data: 返回的数据，没有则留空</li>
<li>time:默认成功和失败都是3秒，</li>
</ul>
<p>代码如下：</p>
<p><img loading="lazy" decoding="async" width="786" height="379" class="wp-image-7485" src="/wp-content/uploads/2018/06/word-image-92.png" srcset="/wp-content/uploads/2018/06/word-image-92.png 786w, /wp-content/uploads/2018/06/word-image-92-300x145.png 300w, /wp-content/uploads/2018/06/word-image-92-768x370.png 768w" sizes="(max-width: 786px) 100vw, 786px" /></p>
<p>success和error方法源码位置： <img loading="lazy" decoding="async" width="392" height="26" class="wp-image-7486" src="/wp-content/uploads/2018/06/word-image-93.png" srcset="/wp-content/uploads/2018/06/word-image-93.png 392w, /wp-content/uploads/2018/06/word-image-93-300x20.png 300w" sizes="(max-width: 392px) 100vw, 392px" /></p>
<h2>重定向</h2>
<p>语法:</p>
<p>$this-&gt; redirect(url,[$params])</p>
<p>参数说明：</p>
<p>第一个参数必填，后面两个个参数可缺省。</p>
<ul>
<li>$url：跳转的地址, 形式为 “模块/控制器/方法&#8221; 。</li>
</ul>
<p>若直接写方法名如：$this-&gt; redirect(‘index’)，默认会重定向到当前模块的当前控制器的index方法。</p>
<p>若直接写控制器名和方法名如：$this-&gt; redirect(‘index/index’)，默认会重定向到当前模块的index控制器的index方法。</p>
<ul>
<li>$params：跳转携带的参数，数组形式如：传id等于3，array(“id”=&gt;3)</li>
</ul>
<p>$this -&gt; redirect(分组/控制器/操作方法)</p>
<p>跳转到的地址：http://网址/分组/控制器/操作方法</p>
<p>$this -&gt; redirect(分组/控制器/操作方法,[参数1=&gt;值1,参数2=&gt;值2])</p>
<p>跳转到的地址：<a href="/goto/8icy" rel="nofollow">http://网址/分组/控制器/操作方法/参数1/值1/参数2/值</a>2</p>
<p>代码如下：</p>
<p><img loading="lazy" decoding="async" width="800" height="196" class="wp-image-7487" src="/wp-content/uploads/2018/06/word-image-94.png" srcset="/wp-content/uploads/2018/06/word-image-94.png 800w, /wp-content/uploads/2018/06/word-image-94-300x74.png 300w, /wp-content/uploads/2018/06/word-image-94-768x188.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p>问：什么时候使用跳转和重定向？</p>
<p>答：</p>
<p>1、需要给用户操作的提示信息，则用跳转。</p>
<p>一般是删除或编辑失败的时候，这需要给用户提示错误信息，操作失败则用跳转error，成功用success。</p>
<p>2、不需要给任何提示信息，则用重定向。</p>
<p>如用户登录成功不需要给提示信息则直接redirect重定向到首页，登录失败就用error给用户提示错误信息。</p>
<h1>请求Request</h1>
<p>手册参考位置：请求&#8211;&gt;请求信息</p>
<h2>获取Request对象</h2>
<p>图解Request对象、response对象：</p>
<p><img loading="lazy" decoding="async" width="744" height="109" class="wp-image-7488" src="/wp-content/uploads/2018/06/word-image-95.png" srcset="/wp-content/uploads/2018/06/word-image-95.png 744w, /wp-content/uploads/2018/06/word-image-95-300x44.png 300w" sizes="(max-width: 744px) 100vw, 744px" /></p>
<p>图解说明：</p>
<ul>
<li>服务端server把客户端请求过来的相关信息都封装在一个Request对象中。如请求地址、请求参数、请求类型、上传的文件信息等。</li>
<li>服务端server把响应给浏览器的相关信息都封装在一个Response对象。如响应http状态码200给客户端等。</li>
</ul>
<p>获取Request对象的方式：</p>
<p>方式一：</p>
<p>引用\think\Request类 ，$request = Request::instance();</p>
<p><img loading="lazy" decoding="async" width="673" height="350" class="wp-image-7489" src="/wp-content/uploads/2018/06/word-image-96.png" srcset="/wp-content/uploads/2018/06/word-image-96.png 673w, /wp-content/uploads/2018/06/word-image-96-300x156.png 300w" sizes="(max-width: 673px) 100vw, 673px" /></p>
<p>助手调试函数dump()；内部封装pre格式化标签。</p>
<p>方式二（最简单的方式）：</p>
<p>通过tp5框架提供的助手函数request()</p>
<p>$request = request();</p>
<p><img loading="lazy" decoding="async" width="698" height="240" class="wp-image-7490" src="/wp-content/uploads/2018/06/word-image-97.png" srcset="/wp-content/uploads/2018/06/word-image-97.png 698w, /wp-content/uploads/2018/06/word-image-97-300x103.png 300w" sizes="(max-width: 698px) 100vw, 698px" /></p>
<p>方式三：</p>
<p>通过依赖注入（闭包）的方式，把Request对象注入到方法内部</p>
<p>public function 方法名(Request $request){}</p>
<p><img loading="lazy" decoding="async" width="640" height="349" class="wp-image-7491" src="/wp-content/uploads/2018/06/word-image-98.png" srcset="/wp-content/uploads/2018/06/word-image-98.png 640w, /wp-content/uploads/2018/06/word-image-98-300x164.png 300w" sizes="(max-width: 640px) 100vw, 640px" /></p>
<p>相当于把Request类的对象$request作为p4的参数。</p>
<h2>2、获取请求信息</h2>
<p>手册参考位置：请求&#8211;&gt;请求信息</p>
<p>$request-&gt;domain(); // 获取当前域名</p>
<p>$request-&gt;baseFile(); // 获取当前入口文件,不含域名</p>
<p>$request-&gt;url(); // 获取当前URL地址</p>
<p>$request-&gt;url(true); // 包含域名的完整URL地址</p>
<p>$request-&gt;baseUrl(); // 获取当前URL地址 不含QUERY_STRING</p>
<p>$request-&gt;pathinfo(); // 获取URL地址中的PATH_INFO信息</p>
<p>$request-&gt;path(); // 获取URL地址中的PATH_INFO信息 不含后缀</p>
<p>$request-&gt;ext(); // 获取URL地址中的后缀信息</p>
<p>$request-&gt;header(); // 获取当前请求的HTTP 请求头信息</p>
<p>$request-&gt;module(); // 获取当前模块名称</p>
<p>$request-&gt;controller(); // 获取当前控制器名称</p>
<p>$request-&gt;action(); // 获取当前操作名称</p>
<p>$request-&gt;method(); // 获取请求方法</p>
<p>$request-&gt;type(); // 获取资源类型</p>
<p>$request-&gt;ip(); // 获取访问ip地址</p>
<p>$request-&gt;isAjax(); // 判断 是否是ajax请求</p>
<p>$request-&gt;isPost(); // 判断 是否是post请求</p>
<p>$request-&gt;isGet(); // 判断 是否是get请求</p>
<p>代码如下：</p>
<p><img loading="lazy" decoding="async" width="967" height="334" class="wp-image-7492" src="/wp-content/uploads/2018/06/word-image-99.png" srcset="/wp-content/uploads/2018/06/word-image-99.png 967w, /wp-content/uploads/2018/06/word-image-99-300x104.png 300w, /wp-content/uploads/2018/06/word-image-99-768x265.png 768w" sizes="(max-width: 967px) 100vw, 967px" /></p>
<h2>3、获取请求参数</h2>
<p>手册参考位置：请求&#8211;&gt;输入变量</p>
<p>语法：变量类型方法(&#8216;变量名/变量修饰符&#8217;,&#8217;默认值&#8217;,&#8217;过滤方法&#8217;)</p>
<table>
<thead>
<tr>
<th><strong>方法</strong></th>
<th><strong>描述</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>param</td>
<td>获取当前请求的变量信息</td>
</tr>
<tr>
<td>get</td>
<td>获取 $_GET 变量</td>
</tr>
<tr>
<td>post</td>
<td>获取 $_POST 变量</td>
</tr>
<tr>
<td>session</td>
<td>获取 $_SESSION 变量</td>
</tr>
<tr>
<td>cookie</td>
<td>获取 $_COOKIE 变量</td>
</tr>
<tr>
<td>request</td>
<td>获取 $_REQUEST 变量</td>
</tr>
<tr>
<td>server</td>
<td>获取 $_SERVER 变量</td>
</tr>
<tr>
<td>env</td>
<td>获取 $_ENV 变量</td>
</tr>
<tr>
<td>route</td>
<td>获取 路由（包括PATHINFO） 变量</td>
</tr>
<tr>
<td>file</td>
<td>获取 $_FILES 变量</td>
</tr>
</tbody>
</table>
<h3>（1）获取PARAM变量</h3>
<p>PARAM变量是框架提供的用于自动识别GET、POST或者的一种变量获取方式，是系统推荐的获取请求参数的方法，用法如下：</p>
<p>// 获取当前请求的name变量</p>
<p>$request-&gt;param(&#8216;name&#8217;);</p>
<p>// 获取当前请求的所有变量（经过过滤）</p>
<p>$request-&gt;param();</p>
<p>// 获取当前请求的所有变量（原始数据）</p>
<p>$request-&gt;param(false);</p>
<p>// 获取当前请求的所有变量（包含上传文件）</p>
<p>$request-&gt;param(true);</p>
<p>注：param方法会把当前请求类型的参数和PATH_INFO变量以及GET请求合并。</p>
<p>或使用助手函数实现：</p>
<p>input(&#8216;param.name&#8217;);</p>
<p>input(&#8216;param.&#8217;);</p>
<p>或者</p>
<p>input(&#8216;name&#8217;);</p>
<p>input(&#8221;);</p>
<p>因为input函数默认底默认就采用PARAM方式进行读取变量。</p>
<h3>（2）获取GET变量</h3>
<p>使用内置的助手函数input获取get参数</p>
<p>input(&#8216;id&#8217;);</p>
<p>input(&#8216;name&#8217;);</p>
<p>input(&#8216;get.&#8217;); //获取整个get数组参数</p>
<p>代码如下：</p>
<ol>
<li>把表单设置get方式提交，不写action默认跳转到当前地址</li>
</ol>
<p><img loading="lazy" decoding="async" width="844" height="299" class="wp-image-7493" src="/wp-content/uploads/2018/06/word-image-100.png" srcset="/wp-content/uploads/2018/06/word-image-100.png 844w, /wp-content/uploads/2018/06/word-image-100-300x106.png 300w, /wp-content/uploads/2018/06/word-image-100-768x272.png 768w" sizes="(max-width: 844px) 100vw, 844px" /></p>
<p>假设输入的数据如下：</p>
<p><img loading="lazy" decoding="async" width="492" height="230" class="wp-image-7494" src="/wp-content/uploads/2018/06/word-image-101.png" srcset="/wp-content/uploads/2018/06/word-image-101.png 492w, /wp-content/uploads/2018/06/word-image-101-300x140.png 300w" sizes="(max-width: 492px) 100vw, 492px" /></p>
<p>b、在当前方法p3中接收整个get参数和单个get参数，结果</p>
<p><img loading="lazy" decoding="async" width="1047" height="260" class="wp-image-7495" src="/wp-content/uploads/2018/06/word-image-102.png" srcset="/wp-content/uploads/2018/06/word-image-102.png 1047w, /wp-content/uploads/2018/06/word-image-102-300x74.png 300w, /wp-content/uploads/2018/06/word-image-102-768x191.png 768w, /wp-content/uploads/2018/06/word-image-102-1024x254.png 1024w" sizes="(max-width: 1047px) 100vw, 1047px" /></p>
<h3>（3）获取POST变量</h3>
<p>使用助手函数实现：</p>
<p>input(&#8216;name&#8217;);</p>
<p>input(&#8216;post.&#8217;); //获取整个post数组参数</p>
<p>代码如下：</p>
<p>a、把表单设置post方式提交，不写action默认跳转到当前地址</p>
<p><img loading="lazy" decoding="async" width="756" height="285" class="wp-image-7496" src="/wp-content/uploads/2018/06/word-image-103.png" srcset="/wp-content/uploads/2018/06/word-image-103.png 756w, /wp-content/uploads/2018/06/word-image-103-300x113.png 300w" sizes="(max-width: 756px) 100vw, 756px" /></p>
<p>假设输入的数据如下：</p>
<p><img loading="lazy" decoding="async" width="426" height="126" class="wp-image-7497" src="/wp-content/uploads/2018/06/word-image-104.png" srcset="/wp-content/uploads/2018/06/word-image-104.png 426w, /wp-content/uploads/2018/06/word-image-104-300x89.png 300w" sizes="(max-width: 426px) 100vw, 426px" /></p>
<p>b、在当前方法p3中判断是否是post请求，获取整个post参数和单个post参数</p>
<p><img loading="lazy" decoding="async" width="939" height="355" class="wp-image-7498" src="/wp-content/uploads/2018/06/word-image-105.png" srcset="/wp-content/uploads/2018/06/word-image-105.png 939w, /wp-content/uploads/2018/06/word-image-105-300x113.png 300w, /wp-content/uploads/2018/06/word-image-105-768x290.png 768w" sizes="(max-width: 939px) 100vw, 939px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7391.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CI框架 安装、路由、模型、视图、控制器、实现用户CURD、跳转函数封装、分页插件、源码分析</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6501.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6501.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 17:29:40 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[分页插件]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[实现用户CURD]]></category>
		<category><![CDATA[控制器]]></category>
		<category><![CDATA[模型]]></category>
		<category><![CDATA[源码分析]]></category>
		<category><![CDATA[视图]]></category>
		<category><![CDATA[路由]]></category>
		<category><![CDATA[跳转函数封装]]></category>
		<guid isPermaLink="false">/?p=6501</guid>

					<description><![CDATA[CI框架 angularJs框架（运行一些设计模式、依赖注入）、laravel（依赖注入）。学习思想上的东西。 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>CI框架</h1>
<p>angularJs框架（运行一些设计模式、依赖注入）、laravel（依赖注入）。学习思想上的东西。</p>
<p>今天CI框架会带大家看源码（前题声明难度有点大）。</p>
<h2>①-框架简介</h2>
<p>CI框架，是一个非常小巧和轻量级的框架，也是最容易入门的框架（里面有一个按需加载的概念，CI框架很多东西都不会自动的载入，当你需要的时候，需要自己去手工的载入，所以它的性能在众多框架中算是比较快的一个（php框架），至少比laravel快了很多。在众多框架中laravel应该是算得上是最慢的。</p>
<p>目前比较流行的框架有CI、laravel；同时还有一些性能为主的C语言框架，例如yaf（c语言框架、使用C语言为php编写了一个扩展windows php_yaf.dll文件 mbstring.dll Linux php_yaf.so&#8212;php.ini）、phaclon（这个框架是国外开发的，性能完全不必yaf差，普及度不及国人开发的yaf）等。</p>
<p>框架就是php自带的，直接可以使用，yaf框架是不提供模型的。</p>
<p>class UserController extends Yaf_Controller{</p>
<p>}</p>
<p><img loading="lazy" decoding="async" width="819" height="290" class="wp-image-6746" src="/wp-content/uploads/2018/05/word-image-6150.png" srcset="/wp-content/uploads/2018/05/word-image-6150.png 819w, /wp-content/uploads/2018/05/word-image-6150-300x106.png 300w, /wp-content/uploads/2018/05/word-image-6150-768x272.png 768w" sizes="(max-width: 819px) 100vw, 819px" /></p>
<p>面对过程、面向对象、面向切面？</p>
<p>答：这三种思想没有哪一个是最好，只有合适自己的业务就是最优的。</p>
<p>问题：为什么laravel这么慢，还有那么多企业在使用？</p>
<p>答：谈一下个人的理解。</p>
<ol>
<li>属于跟风比较多。（很多企业压根就不了解这个框架，只是看到市场现状很多人在使用，那么觉得也要跟上潮流、不得不使用）鸭子现象（从众）</li>
<li>这个框架应用了很多的设计模式，便于开发和维护（并且还要知道laravel产品就是syfomy框架的儿子）</li>
<li>非常明显的一个特点，重路由设计。每一个控制器的方法的访问都必须要设计一个URL地址（路由规则）。index.php/user/add &#8212;&#8212;-&gt; goods/lst 设置在laravel里面可以不存在控制器、也可以不存在模型，视图也可以不存在，但是路由必须存在（可以把所有的业务逻辑放在路由里面完成）。主要是现在web项目相关的项目更倾向于前后端相分离（API接口&#8212;》URL地址&#8212;》路由规则）。</li>
<li>目前框架使用composer的管理工具，可以把互联网上所有php好的工具类库全部整合在一起。（composer理解成node的npm或者Linux的yum工具、前端的bower） composer install upload</li>
<li>并且laravel框架是完全的面向对象的框架，并且只有面向对象的编程思想才可以更好的和现实社会形成联系。（面向对象里面的思想可以和一物一世界完全对应）（面向过程、面向对象、面向切面【钩子函数的思想】&#8230;..）</li>
</ol>
<p>TP里面钩子函数：只需要用户定义在特定的位置，不需要手工的执行，框架会在特定的时间执行这个钩子函数，对数据进行处理。（AOP就是面向切面编程的缩写）</p>
<h2>②-CI框架简介</h2>
<ol>
<li>什么CI框架？</li>
</ol>
<p>答：是一个外国人开发的小巧的框架。目前存在两个主流分支版本，一个是3.x系列，一个是2.x系列。本次课程学习是2.x系列，企业基本都是选择这个版本。（LTS:长时间维护，3年左右的维护期）</p>
<p><img loading="lazy" decoding="async" width="1188" height="337" class="wp-image-6747" src="/wp-content/uploads/2018/05/word-image-6151.png" srcset="/wp-content/uploads/2018/05/word-image-6151.png 1188w, /wp-content/uploads/2018/05/word-image-6151-300x85.png 300w, /wp-content/uploads/2018/05/word-image-6151-768x218.png 768w, /wp-content/uploads/2018/05/word-image-6151-1024x290.png 1024w" sizes="(max-width: 1188px) 100vw, 1188px" /></p>
<h2>③-CI框架入门使用</h2>
<p>框架资料</p>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6748" src="/wp-content/uploads/2018/05/word-image-6152.png" srcset="/wp-content/uploads/2018/05/word-image-6152.png 849w, /wp-content/uploads/2018/05/word-image-6152-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6152-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<ol>
<li>在虚拟主机目录解压对应的框架</li>
</ol>
<p>整体目录结构</p>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6749" src="/wp-content/uploads/2018/05/word-image-6153.png" srcset="/wp-content/uploads/2018/05/word-image-6153.png 849w, /wp-content/uploads/2018/05/word-image-6153-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6153-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<p>分析核心代码目录</p>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6750" src="/wp-content/uploads/2018/05/word-image-6154.png" srcset="/wp-content/uploads/2018/05/word-image-6154.png 849w, /wp-content/uploads/2018/05/word-image-6154-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6154-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /> <img loading="lazy" decoding="async" width="311" height="223" class="wp-image-6751" src="/wp-content/uploads/2018/05/word-image-6155.png" srcset="/wp-content/uploads/2018/05/word-image-6155.png 311w, /wp-content/uploads/2018/05/word-image-6155-300x215.png 300w" sizes="(max-width: 311px) 100vw, 311px" /> <img loading="lazy" decoding="async" width="362" height="321" class="wp-image-6752" src="/wp-content/uploads/2018/05/word-image-6156.png" srcset="/wp-content/uploads/2018/05/word-image-6156.png 362w, /wp-content/uploads/2018/05/word-image-6156-300x266.png 300w" sizes="(max-width: 362px) 100vw, 362px" /></p>
<p>application目录</p>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6753" src="/wp-content/uploads/2018/05/word-image-6157.png" srcset="/wp-content/uploads/2018/05/word-image-6157.png 849w, /wp-content/uploads/2018/05/word-image-6157-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6157-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<p>例如：自己扩展CI的控制器类</p>
<p><img loading="lazy" decoding="async" width="626" height="217" class="wp-image-6754" src="/wp-content/uploads/2018/05/word-image-6158.png" srcset="/wp-content/uploads/2018/05/word-image-6158.png 626w, /wp-content/uploads/2018/05/word-image-6158-300x104.png 300w" sizes="(max-width: 626px) 100vw, 626px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6755" src="/wp-content/uploads/2018/05/word-image-6159.png" srcset="/wp-content/uploads/2018/05/word-image-6159.png 1366w, /wp-content/uploads/2018/05/word-image-6159-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6159-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6159-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>ci框架的访问</li>
</ol>
<p>两种访问方式，直接访问，全路径访问</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6756" src="/wp-content/uploads/2018/05/word-image-6160.png" srcset="/wp-content/uploads/2018/05/word-image-6160.png 1366w, /wp-content/uploads/2018/05/word-image-6160-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6160-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6160-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>全路径访问（默认控制器是welcome控制器、方法是index方法；URL访问模式叫做pathinfo）</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6758" src="/wp-content/uploads/2018/05/word-image-6161.png" srcset="/wp-content/uploads/2018/05/word-image-6161.png 1366w, /wp-content/uploads/2018/05/word-image-6161-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6161-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6161-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>index.php?m=Home&amp;c=Index&amp;a=index （普通模式）</p>
<p>index.php/Home/Index/index （pathinfo模式）</p>
<p>index.php?s=Home&amp;Index&amp;lst（兼容模式）</p>
<p>Index-lst-12.html &#8212;-&gt; index/Home/Index/lst/12 （重写模式）</p>
<h2>④-CI框架-控制器</h2>
<p>如何上手一个CI框架？</p>
<p>答：1. 学习控制器 2. 学习视图 3. 学习模型</p>
<p>具体：</p>
<p>一个控制器如何学习？</p>
<ol>
<li>学习控制器写在哪里？</li>
<li>控制器文件的命令如何命名？</li>
<li>文件里面的内容如何书写？有哪些注意事项？</li>
<li>控制器里面的方法如何书写？注意事项？</li>
<li>控制器方法里面如何载入视图？</li>
<li>如何给视图赋值变量？</li>
<li>视图里面如何显示变量信息？</li>
<li>最后如何在控制器里面实例化模型，从数据库获取数据？</li>
</ol>
<p>实操：</p>
<ol>
<li>控制器文件写在哪里？</li>
</ol>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6759" src="/wp-content/uploads/2018/05/word-image-6162.png" srcset="/wp-content/uploads/2018/05/word-image-6162.png 849w, /wp-content/uploads/2018/05/word-image-6162-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6162-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<ol>
<li>控制器文件如何命名？</li>
</ol>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6760" src="/wp-content/uploads/2018/05/word-image-6163.png" srcset="/wp-content/uploads/2018/05/word-image-6163.png 849w, /wp-content/uploads/2018/05/word-image-6163-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6163-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<ol>
<li>控制器里面的内容如何书写？</li>
</ol>
<p><img loading="lazy" decoding="async" width="1314" height="145" class="wp-image-6761" src="/wp-content/uploads/2018/05/word-image-6164.png" srcset="/wp-content/uploads/2018/05/word-image-6164.png 1314w, /wp-content/uploads/2018/05/word-image-6164-300x33.png 300w, /wp-content/uploads/2018/05/word-image-6164-768x85.png 768w, /wp-content/uploads/2018/05/word-image-6164-1024x113.png 1024w" sizes="(max-width: 1314px) 100vw, 1314px" /></p>
<p>确保所有的请求都是从单入口开始的。</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6762" src="/wp-content/uploads/2018/05/word-image-6165.png" srcset="/wp-content/uploads/2018/05/word-image-6165.png 1366w, /wp-content/uploads/2018/05/word-image-6165-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6165-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6165-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>控制器里面的方法如何书写？</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6763" src="/wp-content/uploads/2018/05/word-image-6166.png" srcset="/wp-content/uploads/2018/05/word-image-6166.png 1366w, /wp-content/uploads/2018/05/word-image-6166-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6166-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6166-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>浏览器访问</p>
<p><img loading="lazy" decoding="async" width="631" height="192" class="wp-image-6764" src="/wp-content/uploads/2018/05/word-image-6167.png" srcset="/wp-content/uploads/2018/05/word-image-6167.png 631w, /wp-content/uploads/2018/05/word-image-6167-300x91.png 300w" sizes="(max-width: 631px) 100vw, 631px" /></p>
<p>注意：在CI框架里面，方法名称不能以_下划线开头，在浏览器是无法访问，但是不影响在类的方法内部被调用</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6765" src="/wp-content/uploads/2018/05/word-image-6168.png" srcset="/wp-content/uploads/2018/05/word-image-6168.png 1366w, /wp-content/uploads/2018/05/word-image-6168-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6168-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6168-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="602" height="220" class="wp-image-6766" src="/wp-content/uploads/2018/05/word-image-6169.png" srcset="/wp-content/uploads/2018/05/word-image-6169.png 602w, /wp-content/uploads/2018/05/word-image-6169-300x110.png 300w" sizes="(max-width: 602px) 100vw, 602px" /></p>
<p>注意：内部使用不受影响</p>
<p><img loading="lazy" decoding="async" width="842" height="482" class="wp-image-6767" src="/wp-content/uploads/2018/05/word-image-6170.png" srcset="/wp-content/uploads/2018/05/word-image-6170.png 842w, /wp-content/uploads/2018/05/word-image-6170-300x172.png 300w, /wp-content/uploads/2018/05/word-image-6170-768x440.png 768w" sizes="(max-width: 842px) 100vw, 842px" /></p>
<p>5. 注意：CI框架控制器里面有一个方法比较特殊，叫做_remap方法，该方法会在其他方法被调用之前，自动的调用</p>
<p><img loading="lazy" decoding="async" width="1160" height="371" class="wp-image-6768" src="/wp-content/uploads/2018/05/word-image-6171.png" srcset="/wp-content/uploads/2018/05/word-image-6171.png 1160w, /wp-content/uploads/2018/05/word-image-6171-300x96.png 300w, /wp-content/uploads/2018/05/word-image-6171-768x246.png 768w, /wp-content/uploads/2018/05/word-image-6171-1024x328.png 1024w" sizes="(max-width: 1160px) 100vw, 1160px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="852" height="216" class="wp-image-6769" src="/wp-content/uploads/2018/05/word-image-6172.png" srcset="/wp-content/uploads/2018/05/word-image-6172.png 852w, /wp-content/uploads/2018/05/word-image-6172-300x76.png 300w, /wp-content/uploads/2018/05/word-image-6172-768x195.png 768w" sizes="(max-width: 852px) 100vw, 852px" /></p>
<p>实际操作：可以做一个简单的前台权限的验证操作。</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6770" src="/wp-content/uploads/2018/05/word-image-6173.png" srcset="/wp-content/uploads/2018/05/word-image-6173.png 1366w, /wp-content/uploads/2018/05/word-image-6173-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6173-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6173-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>验证</p>
<p><img loading="lazy" decoding="async" width="1177" height="510" class="wp-image-6771" src="/wp-content/uploads/2018/05/word-image-6174.png" srcset="/wp-content/uploads/2018/05/word-image-6174.png 1177w, /wp-content/uploads/2018/05/word-image-6174-300x130.png 300w, /wp-content/uploads/2018/05/word-image-6174-768x333.png 768w, /wp-content/uploads/2018/05/word-image-6174-1024x444.png 1024w" sizes="(max-width: 1177px) 100vw, 1177px" /></p>
<p>6. 方法里面如何载入视图？</p>
<p><img loading="lazy" decoding="async" width="885" height="272" class="wp-image-6772" src="/wp-content/uploads/2018/05/word-image-6175.png" srcset="/wp-content/uploads/2018/05/word-image-6175.png 885w, /wp-content/uploads/2018/05/word-image-6175-300x92.png 300w, /wp-content/uploads/2018/05/word-image-6175-768x236.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="970" height="471" class="wp-image-6773" src="/wp-content/uploads/2018/05/word-image-6176.png" srcset="/wp-content/uploads/2018/05/word-image-6176.png 970w, /wp-content/uploads/2018/05/word-image-6176-300x146.png 300w, /wp-content/uploads/2018/05/word-image-6176-768x373.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></p>
<h2>⑤-CI框架-视图</h2>
<p>思考：</p>
<ol>
<li>视图写在哪里？</li>
<li>视图文件如何命名？</li>
<li>视图内容如何书写？</li>
<li>控制器如何调用视图，如何给视图赋值</li>
<li>视图里面如何显示变量（是否可以使用标签语法、或者原生写法）</li>
<li>视图可以分目录管理</li>
<li>控制器里面可以载入多个视图</li>
<li>视图可以分目录管理，那么控制器是否可以分目录管理？可以（分目录其实就是之前其他框架里面的分模块管理：前台、后台）</li>
</ol>
<p>实操</p>
<ol>
<li>写在哪里？</li>
</ol>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6774" src="/wp-content/uploads/2018/05/word-image-6177.png" srcset="/wp-content/uploads/2018/05/word-image-6177.png 849w, /wp-content/uploads/2018/05/word-image-6177-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6177-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<ol>
<li>视图文件如何命名？</li>
</ol>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6775" src="/wp-content/uploads/2018/05/word-image-6178.png" srcset="/wp-content/uploads/2018/05/word-image-6178.png 849w, /wp-content/uploads/2018/05/word-image-6178-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6178-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<ol>
<li>视图里面的内容如何书写？</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6776" src="/wp-content/uploads/2018/05/word-image-6179.png" srcset="/wp-content/uploads/2018/05/word-image-6179.png 1366w, /wp-content/uploads/2018/05/word-image-6179-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6179-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6179-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>4. 如何在控制器里面载入视图文件？</p>
<p><img loading="lazy" decoding="async" width="793" height="316" class="wp-image-6777" src="/wp-content/uploads/2018/05/word-image-6180.png" srcset="/wp-content/uploads/2018/05/word-image-6180.png 793w, /wp-content/uploads/2018/05/word-image-6180-300x120.png 300w, /wp-content/uploads/2018/05/word-image-6180-768x306.png 768w" sizes="(max-width: 793px) 100vw, 793px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="635" height="187" class="wp-image-6778" src="/wp-content/uploads/2018/05/word-image-6181.png" srcset="/wp-content/uploads/2018/05/word-image-6181.png 635w, /wp-content/uploads/2018/05/word-image-6181-300x88.png 300w" sizes="(max-width: 635px) 100vw, 635px" /></p>
<p>5. 如何在控制器里面给视图赋值变量，然后让变量在视图文件显示？</p>
<p>第一种方式赋值[使用少]</p>
<p><img loading="lazy" decoding="async" width="930" height="449" class="wp-image-6779" src="/wp-content/uploads/2018/05/word-image-6182.png" srcset="/wp-content/uploads/2018/05/word-image-6182.png 930w, /wp-content/uploads/2018/05/word-image-6182-300x145.png 300w, /wp-content/uploads/2018/05/word-image-6182-768x371.png 768w" sizes="(max-width: 930px) 100vw, 930px" /></p>
<p>视图代码</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6780" src="/wp-content/uploads/2018/05/word-image-6183.png" srcset="/wp-content/uploads/2018/05/word-image-6183.png 1366w, /wp-content/uploads/2018/05/word-image-6183-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6183-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6183-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="493" height="181" class="wp-image-6781" src="/wp-content/uploads/2018/05/word-image-6184.png" srcset="/wp-content/uploads/2018/05/word-image-6184.png 493w, /wp-content/uploads/2018/05/word-image-6184-300x110.png 300w" sizes="(max-width: 493px) 100vw, 493px" /></p>
<p>第二种方式[使用多]</p>
<p><img loading="lazy" decoding="async" width="1193" height="502" class="wp-image-6782" src="/wp-content/uploads/2018/05/word-image-6185.png" srcset="/wp-content/uploads/2018/05/word-image-6185.png 1193w, /wp-content/uploads/2018/05/word-image-6185-300x126.png 300w, /wp-content/uploads/2018/05/word-image-6185-768x323.png 768w, /wp-content/uploads/2018/05/word-image-6185-1024x431.png 1024w" sizes="(max-width: 1193px) 100vw, 1193px" /></p>
<p>视图代码</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6783" src="/wp-content/uploads/2018/05/word-image-6186.png" srcset="/wp-content/uploads/2018/05/word-image-6186.png 1366w, /wp-content/uploads/2018/05/word-image-6186-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6186-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6186-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="549" height="322" class="wp-image-6784" src="/wp-content/uploads/2018/05/word-image-6187.png" srcset="/wp-content/uploads/2018/05/word-image-6187.png 549w, /wp-content/uploads/2018/05/word-image-6187-300x176.png 300w" sizes="(max-width: 549px) 100vw, 549px" /></p>
<p>6. 注意：CI框架里面的控制器和视图是否可以分目录保存？</p>
<p>控制器分目录，书写位置：</p>
<p><img loading="lazy" decoding="async" width="647" height="192" class="wp-image-6785" src="/wp-content/uploads/2018/05/word-image-6188.png" srcset="/wp-content/uploads/2018/05/word-image-6188.png 647w, /wp-content/uploads/2018/05/word-image-6188-300x89.png 300w" sizes="(max-width: 647px) 100vw, 647px" /></p>
<p>控制器代码：</p>
<p><img loading="lazy" decoding="async" width="1025" height="376" class="wp-image-6786" src="/wp-content/uploads/2018/05/word-image-6189.png" srcset="/wp-content/uploads/2018/05/word-image-6189.png 1025w, /wp-content/uploads/2018/05/word-image-6189-300x110.png 300w, /wp-content/uploads/2018/05/word-image-6189-768x282.png 768w, /wp-content/uploads/2018/05/word-image-6189-1024x376.png 1024w" sizes="(max-width: 1025px) 100vw, 1025px" /></p>
<p>访问：</p>
<p><img loading="lazy" decoding="async" width="801" height="189" class="wp-image-6787" src="/wp-content/uploads/2018/05/word-image-6190.png" srcset="/wp-content/uploads/2018/05/word-image-6190.png 801w, /wp-content/uploads/2018/05/word-image-6190-300x71.png 300w, /wp-content/uploads/2018/05/word-image-6190-768x181.png 768w" sizes="(max-width: 801px) 100vw, 801px" /></p>
<p>视图分目录，书写位置：</p>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6790" src="/wp-content/uploads/2018/05/word-image-6191.png" srcset="/wp-content/uploads/2018/05/word-image-6191.png 849w, /wp-content/uploads/2018/05/word-image-6191-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6191-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<p>控制器代码</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6792" src="/wp-content/uploads/2018/05/word-image-6192.png" srcset="/wp-content/uploads/2018/05/word-image-6192.png 1366w, /wp-content/uploads/2018/05/word-image-6192-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6192-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6192-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6793" src="/wp-content/uploads/2018/05/word-image-6193.png" srcset="/wp-content/uploads/2018/05/word-image-6193.png 1366w, /wp-content/uploads/2018/05/word-image-6193-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6193-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6193-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>注意：CI框架里面的控制器里面可以载入多个视图</p>
<p>视图文件位置：</p>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6794" src="/wp-content/uploads/2018/05/word-image-6194.png" srcset="/wp-content/uploads/2018/05/word-image-6194.png 849w, /wp-content/uploads/2018/05/word-image-6194-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6194-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<p>控制器代码：</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6795" src="/wp-content/uploads/2018/05/word-image-6195.png" srcset="/wp-content/uploads/2018/05/word-image-6195.png 1366w, /wp-content/uploads/2018/05/word-image-6195-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6195-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6195-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6796" src="/wp-content/uploads/2018/05/word-image-6196.png" srcset="/wp-content/uploads/2018/05/word-image-6196.png 1366w, /wp-content/uploads/2018/05/word-image-6196-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6196-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6196-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<h2>⑥-数据库操作</h2>
<p>思考：</p>
<ol>
<li>在CI如何书写配置信息？</li>
<li>在CI里面如何从数据库里面获取数据？</li>
</ol>
<p>实操：</p>
<ol>
<li>建一个用户表</li>
</ol>
<p><img loading="lazy" decoding="async" width="770" height="298" class="wp-image-6797" src="/wp-content/uploads/2018/05/word-image-6197.png" srcset="/wp-content/uploads/2018/05/word-image-6197.png 770w, /wp-content/uploads/2018/05/word-image-6197-300x116.png 300w, /wp-content/uploads/2018/05/word-image-6197-768x297.png 768w" sizes="(max-width: 770px) 100vw, 770px" /></p>
<ol>
<li>先配置数据库的信息</li>
</ol>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6798" src="/wp-content/uploads/2018/05/word-image-6198.png" srcset="/wp-content/uploads/2018/05/word-image-6198.png 849w, /wp-content/uploads/2018/05/word-image-6198-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6198-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<p>配置</p>
<p><img loading="lazy" decoding="async" width="565" height="291" class="wp-image-6799" src="/wp-content/uploads/2018/05/word-image-6199.png" srcset="/wp-content/uploads/2018/05/word-image-6199.png 565w, /wp-content/uploads/2018/05/word-image-6199-300x155.png 300w" sizes="(max-width: 565px) 100vw, 565px" /></p>
<ol>
<li>在控制器里面获取数据库的数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6800" src="/wp-content/uploads/2018/05/word-image-6200.png" srcset="/wp-content/uploads/2018/05/word-image-6200.png 1366w, /wp-content/uploads/2018/05/word-image-6200-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6200-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6200-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>在视图里面显示</li>
</ol>
<p>视图</p>
<p><img loading="lazy" decoding="async" width="730" height="373" class="wp-image-6803" src="/wp-content/uploads/2018/05/word-image-6203.png" srcset="/wp-content/uploads/2018/05/word-image-6203.png 730w, /wp-content/uploads/2018/05/word-image-6203-300x153.png 300w" sizes="(max-width: 730px) 100vw, 730px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6807" src="/wp-content/uploads/2018/05/word-image-6207.png" srcset="/wp-content/uploads/2018/05/word-image-6207.png 1366w, /wp-content/uploads/2018/05/word-image-6207-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6207-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6207-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6812" src="/wp-content/uploads/2018/05/word-image-6212.png" srcset="/wp-content/uploads/2018/05/word-image-6212.png 1366w, /wp-content/uploads/2018/05/word-image-6212-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6212-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6212-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>注意事项：在获取数据操作的时候，必须连接数据[$this-&gt;load-&gt;datebase()], 但是有的时候容易忘记，所以可以自动载入</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6816" src="/wp-content/uploads/2018/05/word-image-6216.png" srcset="/wp-content/uploads/2018/05/word-image-6216.png 1366w, /wp-content/uploads/2018/05/word-image-6216-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6216-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6216-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>在控制器里面就不需要在手工的连接</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6820" src="/wp-content/uploads/2018/05/word-image-6220.png" srcset="/wp-content/uploads/2018/05/word-image-6220.png 1366w, /wp-content/uploads/2018/05/word-image-6220-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6220-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6220-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>这个也被称为CI里面的按需加载。【要连接数据库，才使用$this-&gt;load-&gt;database()连接】</p>
<h2>⑦-CI框架-模型</h2>
<p>思考：</p>
<ol>
<li>模型文件写哪里？</li>
<li>模型文件如何命名？</li>
<li>模型文件里面的内容如何书写？</li>
<li>在控制器里面如何调用模型？</li>
</ol>
<p>实操：</p>
<ol>
<li>模型文件写哪里？</li>
</ol>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6824" src="/wp-content/uploads/2018/05/word-image-6224.png" srcset="/wp-content/uploads/2018/05/word-image-6224.png 849w, /wp-content/uploads/2018/05/word-image-6224-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6224-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<ol>
<li>模型文件如何命名的问题？</li>
</ol>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6828" src="/wp-content/uploads/2018/05/word-image-6228.png" srcset="/wp-content/uploads/2018/05/word-image-6228.png 849w, /wp-content/uploads/2018/05/word-image-6228-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6228-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<ol>
<li>模型里面的内容书写</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6832" src="/wp-content/uploads/2018/05/word-image-6232.png" srcset="/wp-content/uploads/2018/05/word-image-6232.png 1366w, /wp-content/uploads/2018/05/word-image-6232-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6232-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6232-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>书写一个get_user方法获取数据</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6837" src="/wp-content/uploads/2018/05/word-image-6237.png" srcset="/wp-content/uploads/2018/05/word-image-6237.png 1366w, /wp-content/uploads/2018/05/word-image-6237-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6237-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6237-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>在控制器里面调用</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6841" src="/wp-content/uploads/2018/05/word-image-6241.png" srcset="/wp-content/uploads/2018/05/word-image-6241.png 1366w, /wp-content/uploads/2018/05/word-image-6241-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6241-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6241-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>视图显示数据</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6845" src="/wp-content/uploads/2018/05/word-image-6245.png" srcset="/wp-content/uploads/2018/05/word-image-6245.png 1366w, /wp-content/uploads/2018/05/word-image-6245-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6245-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6245-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<h1>简单的实现一套用户的curd</h1>
<p>使用CI框架实现一套完整的增删改查。</p>
<h2>①-用户增加</h2>
<ol>
<li>在user.php控制器文件增加一个add_user方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6848" src="/wp-content/uploads/2018/05/word-image-6248.png" srcset="/wp-content/uploads/2018/05/word-image-6248.png 1366w, /wp-content/uploads/2018/05/word-image-6248-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6248-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6248-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>增加一个add_user.php视图文件</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6851" src="/wp-content/uploads/2018/05/word-image-6251.png" srcset="/wp-content/uploads/2018/05/word-image-6251.png 1366w, /wp-content/uploads/2018/05/word-image-6251-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6251-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6251-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p><strong>备注：在form表单提交的actione里面使用site_url函数之前，需要在自动载入里面进行配置。</strong></p>
<p><img loading="lazy" decoding="async" width="839" height="247" class="wp-image-6854" src="/wp-content/uploads/2018/05/word-image-6254.png" srcset="/wp-content/uploads/2018/05/word-image-6254.png 839w, /wp-content/uploads/2018/05/word-image-6254-300x88.png 300w, /wp-content/uploads/2018/05/word-image-6254-768x226.png 768w" sizes="(max-width: 839px) 100vw, 839px" /></p>
<ol>
<li>在user_model.php文件里面增加一个add_user方法，入库数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6856" src="/wp-content/uploads/2018/05/word-image-6256.png" srcset="/wp-content/uploads/2018/05/word-image-6256.png 1366w, /wp-content/uploads/2018/05/word-image-6256-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6256-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6256-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<h2>②-用户展示</h2>
<p>1. 在user_model.php模型文件增加一个get_user方法</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6859" src="/wp-content/uploads/2018/05/word-image-6259.png" srcset="/wp-content/uploads/2018/05/word-image-6259.png 1366w, /wp-content/uploads/2018/05/word-image-6259-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6259-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6259-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>在user.php控制器里面增加一个get_user方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6861" src="/wp-content/uploads/2018/05/word-image-6261.png" srcset="/wp-content/uploads/2018/05/word-image-6261.png 1366w, /wp-content/uploads/2018/05/word-image-6261-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6261-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6261-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>3. 在lst.php视图显示数据</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6863" src="/wp-content/uploads/2018/05/word-image-6263.png" srcset="/wp-content/uploads/2018/05/word-image-6263.png 1366w, /wp-content/uploads/2018/05/word-image-6263-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6263-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6263-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<h2>③-用户删除</h2>
<ol>
<li>修改lst.php视图文件，增加删除链接</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6865" src="/wp-content/uploads/2018/05/word-image-6265.png" srcset="/wp-content/uploads/2018/05/word-image-6265.png 1366w, /wp-content/uploads/2018/05/word-image-6265-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6265-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6265-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6867" src="/wp-content/uploads/2018/05/word-image-6267.png" srcset="/wp-content/uploads/2018/05/word-image-6267.png 1366w, /wp-content/uploads/2018/05/word-image-6267-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6267-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6267-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>在user.php控制器里面定义del_user方法，完成删除操作</li>
</ol>
<p>注意：获取地址栏里的主键id，需要使用按段获取</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6869" src="/wp-content/uploads/2018/05/word-image-6269.png" srcset="/wp-content/uploads/2018/05/word-image-6269.png 1366w, /wp-content/uploads/2018/05/word-image-6269-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6269-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6269-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6871" src="/wp-content/uploads/2018/05/word-image-6271.png" srcset="/wp-content/uploads/2018/05/word-image-6271.png 1366w, /wp-content/uploads/2018/05/word-image-6271-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6271-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6271-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>3. 在user_model.php模型里面定义一个del_user方法【特别注意：在CI里面做数据删除的时候，需要根据受影响的行来判断数据是否删除成功！】【$this-&gt;db-&gt;delete方法的返回值是sql语句是否成功运行】</p>
<p><img loading="lazy" decoding="async" width="1190" height="392" class="wp-image-6873" src="/wp-content/uploads/2018/05/word-image-6273.png" srcset="/wp-content/uploads/2018/05/word-image-6273.png 1190w, /wp-content/uploads/2018/05/word-image-6273-300x99.png 300w, /wp-content/uploads/2018/05/word-image-6273-768x253.png 768w, /wp-content/uploads/2018/05/word-image-6273-1024x337.png 1024w" sizes="(max-width: 1190px) 100vw, 1190px" /></p>
<p>调试技巧：获取上一次执行的sql语句。</p>
<p><img loading="lazy" decoding="async" width="1159" height="409" class="wp-image-6875" src="/wp-content/uploads/2018/05/word-image-6275.png" srcset="/wp-content/uploads/2018/05/word-image-6275.png 1159w, /wp-content/uploads/2018/05/word-image-6275-300x106.png 300w, /wp-content/uploads/2018/05/word-image-6275-768x271.png 768w, /wp-content/uploads/2018/05/word-image-6275-1024x361.png 1024w" sizes="(max-width: 1159px) 100vw, 1159px" /></p>
<h2>④-用户编辑</h2>
<ol>
<li>在lst.php视图里面增加一个编辑的链接</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6877" src="/wp-content/uploads/2018/05/word-image-6277.png" srcset="/wp-content/uploads/2018/05/word-image-6277.png 1366w, /wp-content/uploads/2018/05/word-image-6277-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6277-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6277-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6879" src="/wp-content/uploads/2018/05/word-image-6279.png" srcset="/wp-content/uploads/2018/05/word-image-6279.png 1366w, /wp-content/uploads/2018/05/word-image-6279-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6279-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6279-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>在user.php控制器里面增加一个edt_user方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6881" src="/wp-content/uploads/2018/05/word-image-6281.png" srcset="/wp-content/uploads/2018/05/word-image-6281.png 1366w, /wp-content/uploads/2018/05/word-image-6281-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6281-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6281-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6884" src="/wp-content/uploads/2018/05/word-image-6283.png" srcset="/wp-content/uploads/2018/05/word-image-6283.png 1366w, /wp-content/uploads/2018/05/word-image-6283-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6283-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6283-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>在user_model.php模型文件增加两个方法find_one和edt_user方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1166" height="721" class="wp-image-6887" src="/wp-content/uploads/2018/05/word-image-6286.png" srcset="/wp-content/uploads/2018/05/word-image-6286.png 1166w, /wp-content/uploads/2018/05/word-image-6286-300x186.png 300w, /wp-content/uploads/2018/05/word-image-6286-768x475.png 768w, /wp-content/uploads/2018/05/word-image-6286-1024x633.png 1024w" sizes="(max-width: 1166px) 100vw, 1166px" /></p>
<ol>
<li>增加一个edt.php视图文件</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6889" src="/wp-content/uploads/2018/05/word-image-6288.png" srcset="/wp-content/uploads/2018/05/word-image-6288.png 1366w, /wp-content/uploads/2018/05/word-image-6288-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6288-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6288-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<h1>三、跳转函数封装</h1>
<p>由于CI框架里面的跳转函数是redirect函数，它不能实现跳转的时候带提示信息。</p>
<p>我们可以参照TP的实现，封装一个带提示的跳转函数。</p>
<ol>
<li>参照TP的实现，完成一个函数的封装，写到如下位置</li>
</ol>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6891" src="/wp-content/uploads/2018/05/word-image-6290.png" srcset="/wp-content/uploads/2018/05/word-image-6290.png 849w, /wp-content/uploads/2018/05/word-image-6290-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6290-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<ol>
<li>调用</li>
</ol>
<p>自动载入自己定义的函数</p>
<p><img loading="lazy" decoding="async" width="1057" height="355" class="wp-image-6893" src="/wp-content/uploads/2018/05/word-image-6292.png" srcset="/wp-content/uploads/2018/05/word-image-6292.png 1057w, /wp-content/uploads/2018/05/word-image-6292-300x101.png 300w, /wp-content/uploads/2018/05/word-image-6292-768x258.png 768w, /wp-content/uploads/2018/05/word-image-6292-1024x344.png 1024w" sizes="(max-width: 1057px) 100vw, 1057px" /></p>
<p>使用</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6895" src="/wp-content/uploads/2018/05/word-image-6294.png" srcset="/wp-content/uploads/2018/05/word-image-6294.png 1366w, /wp-content/uploads/2018/05/word-image-6294-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6294-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6294-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="587" height="348" class="wp-image-6897" src="/wp-content/uploads/2018/05/word-image-6296.png" srcset="/wp-content/uploads/2018/05/word-image-6296.png 587w, /wp-content/uploads/2018/05/word-image-6296-300x178.png 300w" sizes="(max-width: 587px) 100vw, 587px" /></p>
<h1>四、分页插件</h1>
<h2>①-Ajax分页</h2>
<p>在CI里面实现Ajax无刷新分页的效果，还使用一个pagination插件。</p>
<p>网站:http://www.zhangxinxu.com/jq/pagination_zh/</p>
<ol>
<li>在项目引入分页插件</li>
</ol>
<p><img loading="lazy" decoding="async" width="849" height="591" class="wp-image-6899" src="/wp-content/uploads/2018/05/word-image-6298.png" srcset="/wp-content/uploads/2018/05/word-image-6298.png 849w, /wp-content/uploads/2018/05/word-image-6298-300x209.png 300w, /wp-content/uploads/2018/05/word-image-6298-768x535.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<ol>
<li>在页面调用分页插件css和js</li>
</ol>
<p><img loading="lazy" decoding="async" width="1085" height="301" class="wp-image-6901" src="/wp-content/uploads/2018/05/word-image-6300.png" srcset="/wp-content/uploads/2018/05/word-image-6300.png 1085w, /wp-content/uploads/2018/05/word-image-6300-300x83.png 300w, /wp-content/uploads/2018/05/word-image-6300-768x213.png 768w, /wp-content/uploads/2018/05/word-image-6300-1024x284.png 1024w" sizes="(max-width: 1085px) 100vw, 1085px" /> <img loading="lazy" decoding="async" width="1043" height="97" class="wp-image-6903" src="/wp-content/uploads/2018/05/word-image-6302.png" srcset="/wp-content/uploads/2018/05/word-image-6302.png 1043w, /wp-content/uploads/2018/05/word-image-6302-300x28.png 300w, /wp-content/uploads/2018/05/word-image-6302-768x71.png 768w, /wp-content/uploads/2018/05/word-image-6302-1024x95.png 1024w" sizes="(max-width: 1043px) 100vw, 1043px" /></p>
<p>注意：必须先引入jQuery</p>
<ol>
<li>定义数据显示容器和分页字符串</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6905" src="/wp-content/uploads/2018/05/word-image-6304.png" srcset="/wp-content/uploads/2018/05/word-image-6304.png 1366w, /wp-content/uploads/2018/05/word-image-6304-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6304-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6304-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>在js里面调用</li>
</ol>
<p>在user.php控制器的get_user方法获取总记录</p>
<p><img loading="lazy" decoding="async" width="1003" height="326" class="wp-image-6908" src="/wp-content/uploads/2018/05/word-image-6307.png" srcset="/wp-content/uploads/2018/05/word-image-6307.png 1003w, /wp-content/uploads/2018/05/word-image-6307-300x98.png 300w, /wp-content/uploads/2018/05/word-image-6307-768x250.png 768w" sizes="(max-width: 1003px) 100vw, 1003px" /></p>
<p>在user_model.php文件定义一个方法获取总记录</p>
<p><img loading="lazy" decoding="async" width="687" height="294" class="wp-image-6910" src="/wp-content/uploads/2018/05/word-image-6309.png" srcset="/wp-content/uploads/2018/05/word-image-6309.png 687w, /wp-content/uploads/2018/05/word-image-6309-300x128.png 300w" sizes="(max-width: 687px) 100vw, 687px" /></p>
<p>分页插件调用</p>
<p><img loading="lazy" decoding="async" width="952" height="439" class="wp-image-6911" src="/wp-content/uploads/2018/05/word-image-6310.png" srcset="/wp-content/uploads/2018/05/word-image-6310.png 952w, /wp-content/uploads/2018/05/word-image-6310-300x138.png 300w, /wp-content/uploads/2018/05/word-image-6310-768x354.png 768w" sizes="(max-width: 952px) 100vw, 952px" /></p>
<p>分页页码点击回调，发送Ajax获取数据</p>
<p><img loading="lazy" decoding="async" width="960" height="731" class="wp-image-6912" src="/wp-content/uploads/2018/05/word-image-6311.png" srcset="/wp-content/uploads/2018/05/word-image-6311.png 960w, /wp-content/uploads/2018/05/word-image-6311-300x228.png 300w, /wp-content/uploads/2018/05/word-image-6311-768x585.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p>数据格式化函数</p>
<p><img loading="lazy" decoding="async" width="1155" height="385" class="wp-image-6913" src="/wp-content/uploads/2018/05/word-image-6312.png" srcset="/wp-content/uploads/2018/05/word-image-6312.png 1155w, /wp-content/uploads/2018/05/word-image-6312-300x100.png 300w, /wp-content/uploads/2018/05/word-image-6312-768x256.png 768w, /wp-content/uploads/2018/05/word-image-6312-1024x341.png 1024w" sizes="(max-width: 1155px) 100vw, 1155px" /></p>
<ol>
<li>user.php后台返回Ajax数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="918" height="750" class="wp-image-6914" src="/wp-content/uploads/2018/05/word-image-6313.png" srcset="/wp-content/uploads/2018/05/word-image-6313.png 918w, /wp-content/uploads/2018/05/word-image-6313-300x245.png 300w, /wp-content/uploads/2018/05/word-image-6313-768x627.png 768w" sizes="(max-width: 918px) 100vw, 918px" /></p>
<h1>五、CI框架源码分析</h1>
<h2>①-分析入口文件</h2>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6915" src="/wp-content/uploads/2018/05/word-image-6314.png" srcset="/wp-content/uploads/2018/05/word-image-6314.png 1366w, /wp-content/uploads/2018/05/word-image-6314-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6314-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6314-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6916" src="/wp-content/uploads/2018/05/word-image-6315.png" srcset="/wp-content/uploads/2018/05/word-image-6315.png 1366w, /wp-content/uploads/2018/05/word-image-6315-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6315-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6315-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6917" src="/wp-content/uploads/2018/05/word-image-6316.png" srcset="/wp-content/uploads/2018/05/word-image-6316.png 1366w, /wp-content/uploads/2018/05/word-image-6316-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6316-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6316-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6918" src="/wp-content/uploads/2018/05/word-image-6317.png" srcset="/wp-content/uploads/2018/05/word-image-6317.png 1366w, /wp-content/uploads/2018/05/word-image-6317-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6317-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6317-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<h2>②-CI的核心引导类</h2>
<p>注意：一般开源产品的common.php里面存放都是项目必须要使用的函数。</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6919" src="/wp-content/uploads/2018/05/word-image-6318.png" srcset="/wp-content/uploads/2018/05/word-image-6318.png 1366w, /wp-content/uploads/2018/05/word-image-6318-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6318-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6318-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>先分析一下common.php里面的函数【重点分析】</p>
<p>load_class函数</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6920" src="/wp-content/uploads/2018/05/word-image-6319.png" srcset="/wp-content/uploads/2018/05/word-image-6319.png 1366w, /wp-content/uploads/2018/05/word-image-6319-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6319-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6319-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>函数主要是配置load_class使用</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6921" src="/wp-content/uploads/2018/05/word-image-6320.png" srcset="/wp-content/uploads/2018/05/word-image-6320.png 1366w, /wp-content/uploads/2018/05/word-image-6320-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6320-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6320-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6922" src="/wp-content/uploads/2018/05/word-image-6321.png" srcset="/wp-content/uploads/2018/05/word-image-6321.png 1366w, /wp-content/uploads/2018/05/word-image-6321-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6321-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6321-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6923" src="/wp-content/uploads/2018/05/word-image-6322.png" srcset="/wp-content/uploads/2018/05/word-image-6322.png 1366w, /wp-content/uploads/2018/05/word-image-6322-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6322-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6322-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6924" src="/wp-content/uploads/2018/05/word-image-6323.png" srcset="/wp-content/uploads/2018/05/word-image-6323.png 1366w, /wp-content/uploads/2018/05/word-image-6323-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6323-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6323-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<h2>③-CI里面的模型实例化1-装载器分析</h2>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6925" src="/wp-content/uploads/2018/05/word-image-6324.png" srcset="/wp-content/uploads/2018/05/word-image-6324.png 1366w, /wp-content/uploads/2018/05/word-image-6324-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6324-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6324-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>在上面user.php文件里面完成模型的实例化，底层原理是怎么样的？</p>
<p>思考：在控制器里面$this-&gt;load代表是什么？</p>
<p>答：$this-&gt;load 这个属性在用户自定义的控制器里面是不存在的，会去父类的控制器里面查询CI_Controller.php里面查找</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6926" src="/wp-content/uploads/2018/05/word-image-6325.png" srcset="/wp-content/uploads/2018/05/word-image-6325.png 1366w, /wp-content/uploads/2018/05/word-image-6325-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6325-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6325-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>通过查找发现父类里面的构造方法里面使用load_calss(‘Loader’,’core’)进行赋值操作。查看 load_class.php的源码，进行分析</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6927" src="/wp-content/uploads/2018/05/word-image-6326.png" srcset="/wp-content/uploads/2018/05/word-image-6326.png 1366w, /wp-content/uploads/2018/05/word-image-6326-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6326-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6326-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<table>
<tbody>
<tr>
<td>面试题：CI装载器是做什么的？主要是负责类的实例化操作，是system/core/loader.php的实例</td>
</tr>
</tbody>
</table>
<p>先记住：load_class功能：1. 载入类 2. 实例化类 3. 记录类</p>
<p>并且：整个CI框架没有类的自动载入机制，全部使用load_class完成。</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6928" src="/wp-content/uploads/2018/05/word-image-6327.png" srcset="/wp-content/uploads/2018/05/word-image-6327.png 1366w, /wp-content/uploads/2018/05/word-image-6327-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6327-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6327-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<h2>④-CI里面的模型实例化2-实例化模型</h2>
<p>$this-&gt;load-&gt;model(‘user_model’,’user’); === new CI_Loader()-&gt;model(‘user_model’,’user’)</p>
<p>底层原理：</p>
<p>$this-&gt;load本质就是CI_Loader的实例，所以我们需要分析一下Loader.php这个文件里面的内容，在分析一下里面model方法，这个方法是实例化模型的关键。</p>
<p><img loading="lazy" decoding="async" width="1067" height="367" class="wp-image-6929" src="/wp-content/uploads/2018/05/word-image-6328.png" srcset="/wp-content/uploads/2018/05/word-image-6328.png 1067w, /wp-content/uploads/2018/05/word-image-6328-300x103.png 300w, /wp-content/uploads/2018/05/word-image-6328-768x264.png 768w, /wp-content/uploads/2018/05/word-image-6328-1024x352.png 1024w" sizes="(max-width: 1067px) 100vw, 1067px" /></p>
<h2>⑤-CI模型里面的db属性是咋回事？</h2>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6930" src="/wp-content/uploads/2018/05/word-image-6329.png" srcset="/wp-content/uploads/2018/05/word-image-6329.png 1366w, /wp-content/uploads/2018/05/word-image-6329-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6329-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6329-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>之前：$this-&gt;db = new DB(); 这里的$this也是超级对象(get_instance()函数的返回值，或者就是CI_Controller::instance属性&#8212;$this)</p>
<ol>
<li>查找db属性，肯定是在自己的类里面查找，不存在则去父类里面查找</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6931" src="/wp-content/uploads/2018/05/word-image-6330.png" srcset="/wp-content/uploads/2018/05/word-image-6330.png 1366w, /wp-content/uploads/2018/05/word-image-6330-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6330-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6330-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>查看超级对象下是否存在db属性</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6933" src="/wp-content/uploads/2018/05/word-image-6331.png" srcset="/wp-content/uploads/2018/05/word-image-6331.png 1366w, /wp-content/uploads/2018/05/word-image-6331-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6331-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6331-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<p>3. 查看系统的控制器</p>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6934" src="/wp-content/uploads/2018/05/word-image-6332.png" srcset="/wp-content/uploads/2018/05/word-image-6332.png 1366w, /wp-content/uploads/2018/05/word-image-6332-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6332-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6332-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>查看装载器的方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6935" src="/wp-content/uploads/2018/05/word-image-6333.png" srcset="/wp-content/uploads/2018/05/word-image-6333.png 1366w, /wp-content/uploads/2018/05/word-image-6333-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6333-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6333-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<ol>
<li>分析装载器里面的_ci_autoloader方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6936" src="/wp-content/uploads/2018/05/word-image-6334.png" srcset="/wp-content/uploads/2018/05/word-image-6334.png 1366w, /wp-content/uploads/2018/05/word-image-6334-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6334-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6334-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /> <img loading="lazy" decoding="async" width="1114" height="553" class="wp-image-6937" src="/wp-content/uploads/2018/05/word-image-6335.png" srcset="/wp-content/uploads/2018/05/word-image-6335.png 1114w, /wp-content/uploads/2018/05/word-image-6335-300x149.png 300w, /wp-content/uploads/2018/05/word-image-6335-768x381.png 768w, /wp-content/uploads/2018/05/word-image-6335-1024x508.png 1024w" sizes="(max-width: 1114px) 100vw, 1114px" /></p>
<ol>
<li>查看装载器的$this-&gt;dabase()方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6938" src="/wp-content/uploads/2018/05/word-image-6336.png" srcset="/wp-content/uploads/2018/05/word-image-6336.png 1366w, /wp-content/uploads/2018/05/word-image-6336-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6336-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6336-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /> <img loading="lazy" decoding="async" width="1366" height="736" class="wp-image-6939" src="/wp-content/uploads/2018/05/word-image-6337.png" srcset="/wp-content/uploads/2018/05/word-image-6337.png 1366w, /wp-content/uploads/2018/05/word-image-6337-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6337-768x414.png 768w, /wp-content/uploads/2018/05/word-image-6337-1024x552.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6501.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Yaf框架 安装、PHP-ext引入、目录结构、路由、模型、视图、控制器</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6500.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6500.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 17:29:32 +0000</pubDate>
				<category><![CDATA[Yaf]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[PHP-ext引入]]></category>
		<category><![CDATA[Yaf安装]]></category>
		<category><![CDATA[控制器]]></category>
		<category><![CDATA[模型]]></category>
		<category><![CDATA[目录结构]]></category>
		<category><![CDATA[视图]]></category>
		<category><![CDATA[路由]]></category>
		<guid isPermaLink="false">/?p=6500</guid>

					<description><![CDATA[写在前面 鸟哥是谁？ 注意：也是PHP核心开发者之一（目前的最新的PHP7参与其中，并且很大部分的代码都是他贡 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>写在前面</h1>
<h2>鸟哥是谁？</h2>
<p><img loading="lazy" decoding="async" width="684" height="216" class="wp-image-6667" src="/wp-content/uploads/2018/05/word-image-6074.png" srcset="/wp-content/uploads/2018/05/word-image-6074.png 684w, /wp-content/uploads/2018/05/word-image-6074-300x95.png 300w" sizes="(max-width: 684px) 100vw, 684px" /></p>
<p>注意：也是PHP核心开发者之一（目前的最新的PHP7参与其中，并且很大部分的代码都是他贡献的）。和之前Linux私房菜鸟哥不是同一个人（这个鸟哥是台湾，主要是做Linux教程。）但我们yaf的鸟哥是惠新宸（风雪之隅）（之前是在百度工作的时候网名叫做雪候鸟，年龄相对大一点，所以被称为鸟哥。也在新浪微博工作。目前应该是在链家做架构师）</p>
<p><img loading="lazy" decoding="async" width="1046" height="474" class="wp-image-6669" src="/wp-content/uploads/2018/05/word-image-6076.png" srcset="/wp-content/uploads/2018/05/word-image-6076.png 1046w, /wp-content/uploads/2018/05/word-image-6076-300x136.png 300w, /wp-content/uploads/2018/05/word-image-6076-768x348.png 768w, /wp-content/uploads/2018/05/word-image-6076-1024x464.png 1024w" sizes="(max-width: 1046px) 100vw, 1046px" /></p>
<p>相关报道：</p>
<p><a href="http://www.infoq.com/cn/articles/weibo-architect-on-php-development">http://www.infoq.com/cn/articles/weibo-architect-on-php-development</a></p>
<h2>yaf是什么？</h2>
<p><img loading="lazy" decoding="async" width="1054" height="498" class="wp-image-6671" src="/wp-content/uploads/2018/05/word-image-6078.png" srcset="/wp-content/uploads/2018/05/word-image-6078.png 1054w, /wp-content/uploads/2018/05/word-image-6078-300x142.png 300w, /wp-content/uploads/2018/05/word-image-6078-768x363.png 768w, /wp-content/uploads/2018/05/word-image-6078-1024x484.png 1024w" sizes="(max-width: 1054px) 100vw, 1054px" /></p>
<p>注意：yaf框架是使用C语言进行编写的，编程之后编程成一个dll文件作为PHP的扩展进行出现，当PHP引入该扩展后，就在PHP里面内置很多的类库。然后我们就可以直接调用这些类库（等价PHP里面内置的一些功能，例如内置的函数、stdClass内置标准类），注意：同类型的框架还有国外的phalcon框架，也是做为PHP的出现，也是一个高性能的扩展，这类框架的性能折损非常少，性能仅次于原生的PHP。看一下官方的简介：</p>
<p><img loading="lazy" decoding="async" width="1601" height="771" class="wp-image-6673" src="/wp-content/uploads/2018/05/word-image-6080.png" srcset="/wp-content/uploads/2018/05/word-image-6080.png 1601w, /wp-content/uploads/2018/05/word-image-6080-300x144.png 300w, /wp-content/uploads/2018/05/word-image-6080-768x370.png 768w, /wp-content/uploads/2018/05/word-image-6080-1024x493.png 1024w" sizes="(max-width: 1601px) 100vw, 1601px" /></p>
<h2>相关资源</h2>
<p>yaf手册：<a href="http://yaf.laruence.com/">http://yaf.laruence.com/</a></p>
<p>github地址：https://github.com/laruence/yaf</p>
<p>作者博客：<a href="http://www.laruence.com/">http://www.laruence.com/</a></p>
<h1>yaf安装</h1>
<h2>dll扩展下载</h2>
<p>yaf框架是作为PHP的一个扩展存在的，所以我们需要去下载对应的扩展文件，然后在php.ini文件引入即可。</p>
<p>扩展下载地址：</p>
<p><a href="http://pecl.php.net/package/yaf">http://pecl.php.net/package/yaf</a></p>
<p><img loading="lazy" decoding="async" width="1554" height="853" class="wp-image-6675" src="/wp-content/uploads/2018/05/word-image-6082.png" srcset="/wp-content/uploads/2018/05/word-image-6082.png 1554w, /wp-content/uploads/2018/05/word-image-6082-300x165.png 300w, /wp-content/uploads/2018/05/word-image-6082-768x422.png 768w, /wp-content/uploads/2018/05/word-image-6082-1024x562.png 1024w" sizes="(max-width: 1554px) 100vw, 1554px" /></p>
<p>这里我们假设使用的朋友都是使用的windows操作系统，点击DLL下载即可，这里我们一2.3.5为例。接下来我们来到具体的下载页面：</p>
<p><img loading="lazy" decoding="async" width="1580" height="646" class="wp-image-6677" src="/wp-content/uploads/2018/05/word-image-6084.png" srcset="/wp-content/uploads/2018/05/word-image-6084.png 1580w, /wp-content/uploads/2018/05/word-image-6084-300x123.png 300w, /wp-content/uploads/2018/05/word-image-6084-768x314.png 768w, /wp-content/uploads/2018/05/word-image-6084-1024x419.png 1024w" sizes="(max-width: 1580px) 100vw, 1580px" /></p>
<p>版本新的的选择需要严格的依赖phpinfo函数给出的信息</p>
<h2>PHP-ext引入</h2>
<p>将下载后的php_yaf.dll文件复制到PHP的ext扩展目录即可</p>
<p><img loading="lazy" decoding="async" width="1000" height="389" class="wp-image-6680" src="/wp-content/uploads/2018/05/word-image-6087.png" srcset="/wp-content/uploads/2018/05/word-image-6087.png 1000w, /wp-content/uploads/2018/05/word-image-6087-300x117.png 300w, /wp-content/uploads/2018/05/word-image-6087-768x299.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<h2>php.ini配置文件</h2>
<p>最后在php.ini文件最后面中引入如下一段即可：</p>
<p>[yaf]</p>
<p>extension=php_yaf.dll</p>
<p>yaf.environ=product</p>
<p>重复apache后，使用phpinfo函数见到如下信息即代表扩展配置成功。</p>
<p><img loading="lazy" decoding="async" width="1349" height="580" class="wp-image-6682" src="/wp-content/uploads/2018/05/word-image-6089.png" srcset="/wp-content/uploads/2018/05/word-image-6089.png 1349w, /wp-content/uploads/2018/05/word-image-6089-300x129.png 300w, /wp-content/uploads/2018/05/word-image-6089-768x330.png 768w, /wp-content/uploads/2018/05/word-image-6089-1024x440.png 1024w" sizes="(max-width: 1349px) 100vw, 1349px" /></p>
<p>注意：当我们把PHP的yaf扩展引入后，PHP内部就会存在很多的yaf提供的类库，但是yaf官方并没有给出yaf框架的目录文件等信息，但是提供一个官方的建议：yaf框架的目录的组织结构应该如何实现。</p>
<p><img loading="lazy" decoding="async" width="763" height="519" class="wp-image-6685" src="/wp-content/uploads/2018/05/word-image-6091.png" srcset="/wp-content/uploads/2018/05/word-image-6091.png 763w, /wp-content/uploads/2018/05/word-image-6091-300x204.png 300w, /wp-content/uploads/2018/05/word-image-6091-220x150.png 220w" sizes="(max-width: 763px) 100vw, 763px" /></p>
<h1>yaf快速入门</h1>
<h2>项目目录结构</h2>
<p>在成功安装扩展后，我们就可以使用yaf进行开发，但是在开发之前，我们需要规划一个项目开发目录。</p>
<p>当让我们也可以使用官方提供的代码生成工具进行自动生成：</p>
<p><a href="http://www.laruence.com/manual/tutorial.last.html">http://www.laruence.com/manual/tutorial.last.html</a></p>
<p>官方的建议目录如下：</p>
<p>application</p>
<p>│ │ Bootstrap.php</p>
<p>│ ├─common</p>
<p>│ │ functions.php</p>
<p>│ ├─controllers</p>
<p>│ │ Index.php</p>
<p>│ ├─library</p>
<p>│ ├─models</p>
<p>│ │ │ User.php</p>
<p>│ │ │</p>
<p>│ │ └─Db</p>
<p>│ │ Medoo.php</p>
<p>│ ├─modules</p>
<p>│ │ └─Admin</p>
<p>│ │ ├─controllers</p>
<p>│ │ │ Back.php</p>
<p>│ │ └─views</p>
<p>│ ├─plugins</p>
<p>│ └─views</p>
<p>│ └─index</p>
<p>│ index.phtml</p>
<p>├─conf</p>
<p>│ application.ini</p>
<p>│</p>
<p>└─public</p>
<p>index.php</p>
<h2>虚拟主机配置</h2>
<p>需要注意的是，项目的入口文件是放在public目录下的，则我们建立的项目的虚拟主机的目录应该是指定到public目录。一个示例的虚拟主机的配置如下：</p>
<p>&lt;VirtualHost *:80&gt;</p>
<p>DocumentRoot &#8220;C:\phpStudy\WWW\yaf.dev\public&#8221;</p>
<p>ServerName yaf.dev</p>
<p>ServerAlias</p>
<p>&lt;Directory &#8220;C:\phpStudy\WWW\yaf.dev\public&#8221;&gt;</p>
<p>Options Indexes FollowSymLinks ExecCGI</p>
<p>AllowOverride All</p>
<p>Order allow,deny</p>
<p>Allow from all</p>
<p>Require all granted</p>
<p>&lt;/Directory&gt;</p>
<p>&lt;/VirtualHost&gt;</p>
<h2>入口文件编写</h2>
<p>在public目录的index.php文件的内容如下：</p>
<p>需要注意的是，只需要在该文件定义一个常量，然后实例化Yaf_application()，同时传递一个配置文件即可。</p>
<p>&lt;?php</p>
<p>define(&#8220;APPLICATION_PATH&#8221;, realpath(dirname(__FILE__) . &#8216;/../&#8217;));</p>
<p>define(&#8220;APPLICATION_COINFIG_FILE&#8221;,APPLICATION_PATH . &#8220;/conf/application.ini&#8221;);</p>
<p>date_default_timezone_set(&#8216;Asia/Shanghai&#8217;);</p>
<p>$app = new Yaf_Application(APPLICATION_COINFIG_FILE);</p>
<p>$app-&gt;bootstrap()-&gt;run();</p>
<h2>配置文件</h2>
<p>在config目录的application.ini文件里面只需要定义如下的配置内容即可。</p>
<p>[product]</p>
<p>;分号代表注释，支持直接写PHP中的已定义常量</p>
<p>application.directory=APPLICATION_PATH &#8220;/application/&#8221;</p>
<p>通过刚才的手工目录创建和yaf官方提供的代码生成器的创建，我们发现目录创建还是比较繁琐不适合入门的人去捯饬，那我们可以使用默认的目录结构来进行学习。</p>
<p><img loading="lazy" decoding="async" width="789" height="261" class="wp-image-6686" src="/wp-content/uploads/2018/05/word-image-6092.png" srcset="/wp-content/uploads/2018/05/word-image-6092.png 789w, /wp-content/uploads/2018/05/word-image-6092-300x99.png 300w, /wp-content/uploads/2018/05/word-image-6092-768x254.png 768w" sizes="(max-width: 789px) 100vw, 789px" /></p>
<h1>composer管理</h1>
<p>简介</p>
<p>网站：<a href="https://packagist.org/packages/gogery/yaf">https://packagist.org/packages/gogery/yaf</a></p>
<p><img loading="lazy" decoding="async" width="697" height="307" class="wp-image-6688" src="/wp-content/uploads/2018/05/word-image-6094.png" srcset="/wp-content/uploads/2018/05/word-image-6094.png 697w, /wp-content/uploads/2018/05/word-image-6094-300x132.png 300w" sizes="(max-width: 697px) 100vw, 697px" /></p>
<ol>
<li>使用命令创建本地项目 local.yaf.com</li>
</ol>
<p><img loading="lazy" decoding="async" width="1689" height="518" class="wp-image-6690" src="/wp-content/uploads/2018/05/word-image-6096.png" srcset="/wp-content/uploads/2018/05/word-image-6096.png 1689w, /wp-content/uploads/2018/05/word-image-6096-300x92.png 300w, /wp-content/uploads/2018/05/word-image-6096-768x236.png 768w, /wp-content/uploads/2018/05/word-image-6096-1024x314.png 1024w" sizes="(max-width: 1689px) 100vw, 1689px" /></p>
<p>&gt; composer create-project gogery/yaf local.yaf.com</p>
<ol>
<li>生成目录结构</li>
</ol>
<p><img loading="lazy" decoding="async" width="850" height="376" class="wp-image-6692" src="/wp-content/uploads/2018/05/word-image-6098.png" srcset="/wp-content/uploads/2018/05/word-image-6098.png 850w, /wp-content/uploads/2018/05/word-image-6098-300x133.png 300w, /wp-content/uploads/2018/05/word-image-6098-768x340.png 768w" sizes="(max-width: 850px) 100vw, 850px" /></p>
<ol>
<li>配置虚拟主机</li>
</ol>
<p>&lt;VirtualHost *:80&gt;</p>
<p>DocumentRoot &#8220;C:\phpStudy\WWW\local.yaf.com\public&#8221;</p>
<p>ServerName local.yaf.com</p>
<p>ServerAlias</p>
<p>&lt;Directory &#8220;C:\phpStudy\WWW\local.yaf.com\public&#8221;&gt;</p>
<p>Options FollowSymLinks ExecCGI</p>
<p>AllowOverride All</p>
<p>Order allow,deny</p>
<p>Allow from all</p>
<p>Require all granted</p>
<p>&lt;/Directory&gt;</p>
<p>&lt;/VirtualHost&gt;</p>
<ol>
<li>浏览器访问效果</li>
</ol>
<p><img loading="lazy" decoding="async" width="660" height="308" class="wp-image-6694" src="/wp-content/uploads/2018/05/word-image-6100.png" srcset="/wp-content/uploads/2018/05/word-image-6100.png 660w, /wp-content/uploads/2018/05/word-image-6100-300x140.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<p>建议大家直接使用composer进行目录的管理。</p>
<h1>IDE配置</h1>
<p>注意：yaf框架扩展的引入，在使用的时候内置了很多的类文件，如果没有一个IDE进行代码的提示，我们是很难记得住到底存在哪些类，哪些方法，则我们可以为IDE配置一下代码提示。yaf代码提示的插件。</p>
<p>网站：<a href="https://github.com/elad-yosifon/php-yaf-doc">https://github.com/elad-yosifon/php-yaf-doc</a></p>
<ol>
<li>插件解压</li>
</ol>
<p><img loading="lazy" decoding="async" width="1020" height="415" class="wp-image-6696" src="/wp-content/uploads/2018/05/word-image-6102.png" srcset="/wp-content/uploads/2018/05/word-image-6102.png 1020w, /wp-content/uploads/2018/05/word-image-6102-300x122.png 300w, /wp-content/uploads/2018/05/word-image-6102-768x312.png 768w" sizes="(max-width: 1020px) 100vw, 1020px" /></p>
<ol>
<li>配置phpstorm的插件目录</li>
</ol>
<p><img loading="lazy" decoding="async" width="1869" height="524" class="wp-image-6698" src="/wp-content/uploads/2018/05/word-image-6104.png" srcset="/wp-content/uploads/2018/05/word-image-6104.png 1869w, /wp-content/uploads/2018/05/word-image-6104-300x84.png 300w, /wp-content/uploads/2018/05/word-image-6104-768x215.png 768w, /wp-content/uploads/2018/05/word-image-6104-1024x287.png 1024w" sizes="(max-width: 1869px) 100vw, 1869px" /></p>
<p>配置插件的目录</p>
<p><img loading="lazy" decoding="async" width="1857" height="520" class="wp-image-6700" src="/wp-content/uploads/2018/05/word-image-6106.png" srcset="/wp-content/uploads/2018/05/word-image-6106.png 1857w, /wp-content/uploads/2018/05/word-image-6106-300x84.png 300w, /wp-content/uploads/2018/05/word-image-6106-768x215.png 768w, /wp-content/uploads/2018/05/word-image-6106-1024x287.png 1024w" sizes="(max-width: 1857px) 100vw, 1857px" /></p>
<p>目录结构以及插件都安装完成后，则可以正式的学习yaf框架（yaf框架也是一个单一入口 + MVC架构）。</p>
<p>学习框架主要是从如下几个方面进行学习：（MVC CVM）</p>
<ol>
<li>学习控制器</li>
<li>学习视图</li>
<li>学习模型（但是需要注意的，yaf框架本身是没有提供模型，这个需要用户自己去完成，因为作者觉得pdo已经是一个很好的操作数据库的工具，没必要在写一个，我们会单独的学习一个第三方的模型类 Medoo）</li>
</ol>
<p><img loading="lazy" decoding="async" width="1270" height="424" class="wp-image-6703" src="/wp-content/uploads/2018/05/word-image-6109.png" srcset="/wp-content/uploads/2018/05/word-image-6109.png 1270w, /wp-content/uploads/2018/05/word-image-6109-300x100.png 300w, /wp-content/uploads/2018/05/word-image-6109-768x256.png 768w, /wp-content/uploads/2018/05/word-image-6109-1024x342.png 1024w" sizes="(max-width: 1270px) 100vw, 1270px" /></p>
<ol>
<li>配置文件</li>
<li>&#8230;..</li>
</ol>
<h1>控制器-constrollers</h1>
<p>经过上面的操作，基本的目录结构已经搭建完毕，接下来我们完成我们的第一个控制器的编写。在正式编写控制器之前，我们只要弄清楚如下几个问题，即可快速掌握控制器的使用。</p>
<ol>
<li>控制器写在哪里？</li>
<li>控制器的文件如何命名？</li>
<li>控制器里面的内容如何编写？</li>
<li>控制器里面的方法如何命名？</li>
<li>控制器里面如何载入视图？</li>
<li>控制器里面如何给视图赋值？</li>
<li>如何在视图里面显示控制器的赋值变量？</li>
</ol>
<p>实操：</p>
<ol>
<li>控制器写在哪里？（application/controllers目录）</li>
<li>控制器的文件如何命名？</li>
</ol>
<p><img loading="lazy" decoding="async" width="897" height="252" class="wp-image-6705" src="/wp-content/uploads/2018/05/word-image-6111.png" srcset="/wp-content/uploads/2018/05/word-image-6111.png 897w, /wp-content/uploads/2018/05/word-image-6111-300x84.png 300w, /wp-content/uploads/2018/05/word-image-6111-768x216.png 768w" sizes="(max-width: 897px) 100vw, 897px" /></p>
<ol>
<li>控制器里面的内容如何编写？</li>
</ol>
<p><img loading="lazy" decoding="async" width="1212" height="711" class="wp-image-6706" src="/wp-content/uploads/2018/05/word-image-6112.png" srcset="/wp-content/uploads/2018/05/word-image-6112.png 1212w, /wp-content/uploads/2018/05/word-image-6112-300x176.png 300w, /wp-content/uploads/2018/05/word-image-6112-768x451.png 768w, /wp-content/uploads/2018/05/word-image-6112-1024x601.png 1024w" sizes="(max-width: 1212px) 100vw, 1212px" /></p>
<ol>
<li>控制器里面的方法如何命名？</li>
</ol>
<p><img loading="lazy" decoding="async" width="1702" height="653" class="wp-image-6708" src="/wp-content/uploads/2018/05/word-image-6114.png" srcset="/wp-content/uploads/2018/05/word-image-6114.png 1702w, /wp-content/uploads/2018/05/word-image-6114-300x115.png 300w, /wp-content/uploads/2018/05/word-image-6114-768x295.png 768w, /wp-content/uploads/2018/05/word-image-6114-1024x393.png 1024w" sizes="(max-width: 1702px) 100vw, 1702px" /></p>
<ol>
<li>控制器里面如何载入视图？</li>
</ol>
<p><img loading="lazy" decoding="async" width="1265" height="522" class="wp-image-6710" src="/wp-content/uploads/2018/05/word-image-6116.png" srcset="/wp-content/uploads/2018/05/word-image-6116.png 1265w, /wp-content/uploads/2018/05/word-image-6116-300x124.png 300w, /wp-content/uploads/2018/05/word-image-6116-768x317.png 768w, /wp-content/uploads/2018/05/word-image-6116-1024x423.png 1024w" sizes="(max-width: 1265px) 100vw, 1265px" /></p>
<p>视图创建</p>
<p><img loading="lazy" decoding="async" width="1226" height="646" class="wp-image-6713" src="/wp-content/uploads/2018/05/word-image-6119.png" srcset="/wp-content/uploads/2018/05/word-image-6119.png 1226w, /wp-content/uploads/2018/05/word-image-6119-300x158.png 300w, /wp-content/uploads/2018/05/word-image-6119-768x405.png 768w, /wp-content/uploads/2018/05/word-image-6119-1024x540.png 1024w" sizes="(max-width: 1226px) 100vw, 1226px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="770" height="251" class="wp-image-6715" src="/wp-content/uploads/2018/05/word-image-6121.png" srcset="/wp-content/uploads/2018/05/word-image-6121.png 770w, /wp-content/uploads/2018/05/word-image-6121-300x98.png 300w, /wp-content/uploads/2018/05/word-image-6121-768x250.png 768w" sizes="(max-width: 770px) 100vw, 770px" /></p>
<ol>
<li>控制器里面如何给视图赋值？</li>
</ol>
<p><img loading="lazy" decoding="async" width="1838" height="987" class="wp-image-6717" src="/wp-content/uploads/2018/05/word-image-6123.png" srcset="/wp-content/uploads/2018/05/word-image-6123.png 1838w, /wp-content/uploads/2018/05/word-image-6123-300x161.png 300w, /wp-content/uploads/2018/05/word-image-6123-768x412.png 768w, /wp-content/uploads/2018/05/word-image-6123-1024x550.png 1024w" sizes="(max-width: 1838px) 100vw, 1838px" /></p>
<ol>
<li>如何在视图里面显示控制器的赋值变量？（直接使用原生的PHP输出、yaf内置的模板引擎只支持原生的PHP语法）</li>
</ol>
<p><img loading="lazy" decoding="async" width="1463" height="802" class="wp-image-6719" src="/wp-content/uploads/2018/05/word-image-6125.png" srcset="/wp-content/uploads/2018/05/word-image-6125.png 1463w, /wp-content/uploads/2018/05/word-image-6125-300x164.png 300w, /wp-content/uploads/2018/05/word-image-6125-768x421.png 768w, /wp-content/uploads/2018/05/word-image-6125-1024x561.png 1024w" sizes="(max-width: 1463px) 100vw, 1463px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="995" height="351" class="wp-image-6721" src="/wp-content/uploads/2018/05/word-image-6127.png" srcset="/wp-content/uploads/2018/05/word-image-6127.png 995w, /wp-content/uploads/2018/05/word-image-6127-300x106.png 300w, /wp-content/uploads/2018/05/word-image-6127-768x271.png 768w" sizes="(max-width: 995px) 100vw, 995px" /></p>
<h1>视图-views</h1>
<p>视图主要是用户来展示数据和收集用户的数据。</p>
<p><img loading="lazy" decoding="async" width="1110" height="814" class="wp-image-6722" src="/wp-content/uploads/2018/05/word-image-6128.png" srcset="/wp-content/uploads/2018/05/word-image-6128.png 1110w, /wp-content/uploads/2018/05/word-image-6128-300x220.png 300w, /wp-content/uploads/2018/05/word-image-6128-768x563.png 768w, /wp-content/uploads/2018/05/word-image-6128-1024x751.png 1024w" sizes="(max-width: 1110px) 100vw, 1110px" /></p>
<p>在正式学习视图之前，我们先思考如下几个问题：</p>
<p>1. 视图文件写在哪里？</p>
<p>2. 视图文件如何命名？</p>
<p>3. 如何在控制器里面调用视图，如何获取视图里面的内容？</p>
<p>4. 在控制器里面如何给视图赋值？</p>
<p>5. 如何在视图里面显示控制器的赋值变量？</p>
<p>实操：</p>
<ol>
<li>视图文件写在哪里？（注意：需要注意是存在模块，如果有模块，则写在模块的对应的views目录，没有则写在application/views/目录下）</li>
</ol>
<p><img loading="lazy" decoding="async" width="1499" height="580" class="wp-image-6723" src="/wp-content/uploads/2018/05/word-image-6129.png" srcset="/wp-content/uploads/2018/05/word-image-6129.png 1499w, /wp-content/uploads/2018/05/word-image-6129-300x116.png 300w, /wp-content/uploads/2018/05/word-image-6129-768x297.png 768w, /wp-content/uploads/2018/05/word-image-6129-1024x396.png 1024w" sizes="(max-width: 1499px) 100vw, 1499px" /></p>
<ol>
<li>视图文件如何命名？</li>
</ol>
<p>答：文件的命名满足和方法同名，并且后缀是 phtml</p>
<ol>
<li>如何在控制器里面调用视图，如何获取视图里面的内容？</li>
</ol>
<p>答：yaf框架默认会自动载入视图</p>
<p>如果终止return false 或者 Yaf_Dispatcher::getInstance()-&gt;disableView();</p>
<ol>
<li>在控制器里面如何给视图赋值？</li>
</ol>
<p>答：$this-&gt;getView()-&gt;assign(&#8216;视图调用名称&#8217;, $变量名称)</p>
<ol>
<li>如何在视图里面显示控制器的赋值变量？</li>
</ol>
<p>答：原生的PHP</p>
<p>注意：Yaf_View_Simple 常见方法使用：</p>
<p><img loading="lazy" decoding="async" width="1830" height="950" class="wp-image-6724" src="/wp-content/uploads/2018/05/word-image-6130.png" srcset="/wp-content/uploads/2018/05/word-image-6130.png 1830w, /wp-content/uploads/2018/05/word-image-6130-300x156.png 300w, /wp-content/uploads/2018/05/word-image-6130-768x399.png 768w, /wp-content/uploads/2018/05/word-image-6130-1024x532.png 1024w" sizes="(max-width: 1830px) 100vw, 1830px" /></p>
<h1>yaf模型-models</h1>
<h2>注意</h2>
<p>需要注意的是yaf框架并没有提供模型类，这个需要用户自己去实现，我们可以自己封装一个模型，也可以使用被人提供好的模型类文件，例如如下的一个模型类：</p>
<p>相关文档：<a href="http://medoo.lvtao.net/doc.php">http://medoo.lvtao.net/doc.php</a></p>
<h2>Medoo基本使用</h2>
<ol>
<li>下载</li>
<li>引入</li>
<li>实例化（进行数据库配置）</li>
</ol>
<p>实操：</p>
<p>具体代码参考</p>
<p><img loading="lazy" decoding="async" width="1188" height="695" class="wp-image-6725" src="/wp-content/uploads/2018/05/word-image-6131.png" srcset="/wp-content/uploads/2018/05/word-image-6131.png 1188w, /wp-content/uploads/2018/05/word-image-6131-300x176.png 300w, /wp-content/uploads/2018/05/word-image-6131-768x449.png 768w, /wp-content/uploads/2018/05/word-image-6131-1024x599.png 1024w" sizes="(max-width: 1188px) 100vw, 1188px" /></p>
<h2>模型命名</h2>
<p>注意：yaf框架并没有模型类，但是规定了模型的书写的规则以及加载的实现。</p>
<p>命名、实例化如何加载。</p>
<p>例如：我们打算在application/models/目录下创建一个Goods.php类文件，则类名应该如下：</p>
<p><img loading="lazy" decoding="async" width="1607" height="946" class="wp-image-6726" src="/wp-content/uploads/2018/05/word-image-6132.png" srcset="/wp-content/uploads/2018/05/word-image-6132.png 1607w, /wp-content/uploads/2018/05/word-image-6132-300x177.png 300w, /wp-content/uploads/2018/05/word-image-6132-768x452.png 768w, /wp-content/uploads/2018/05/word-image-6132-1024x603.png 1024w" sizes="(max-width: 1607px) 100vw, 1607px" /></p>
<p>通过上面的操作我们可以很方面的完成模型类的定义，当我们定义好了之后，直接在控制器里面进行实例化即可，yaf框架会自动进行类的载入。</p>
<p>问题：通过上面的操作定义的模型类是直接在application/models目录下定义的，如果现在我们需要在该目录下在建立子目录，然后在子目录里面定义模型，则模型的类名该如何定义？</p>
<p><img loading="lazy" decoding="async" width="1819" height="803" class="wp-image-6727" src="/wp-content/uploads/2018/05/word-image-6133.png" srcset="/wp-content/uploads/2018/05/word-image-6133.png 1819w, /wp-content/uploads/2018/05/word-image-6133-300x132.png 300w, /wp-content/uploads/2018/05/word-image-6133-768x339.png 768w, /wp-content/uploads/2018/05/word-image-6133-1024x452.png 1024w" sizes="(max-width: 1819px) 100vw, 1819px" /></p>
<p>总结：在yaf里面模型的命名是通过下划线来查找类的目录结构。</p>
<h1>yaf模块化-modules</h1>
<h2>配置</h2>
<p>注意：yaf框架默认的目录结构里面使用的Index模块，如果我们需要进行其他的模块的创建，例如配置后台Admin模块，Member模块。则我们需要在application.ini里面进行配置，然后在application/modules/目录创建对应的模块目录，模块目录下创建对应的controllers目录和views目录。</p>
<p>假如我们要新增加一个Member模块用来做后台管理（需要注意的是如果我们使用模块功能，则必须加上Index模块）。则我们需要在application.ini的某个节里面配置如下信息：</p>
<p>application.modules = &#8220;Index,Member&#8221;</p>
<p><img loading="lazy" decoding="async" width="1474" height="642" class="wp-image-6728" src="/wp-content/uploads/2018/05/word-image-6134.png" srcset="/wp-content/uploads/2018/05/word-image-6134.png 1474w, /wp-content/uploads/2018/05/word-image-6134-300x131.png 300w, /wp-content/uploads/2018/05/word-image-6134-768x335.png 768w, /wp-content/uploads/2018/05/word-image-6134-1024x446.png 1024w" sizes="(max-width: 1474px) 100vw, 1474px" /></p>
<h2>新建模块</h2>
<p>需要注意的是：其中Admin目录就和配置的模块名称一致，每个模块目录下都可以新建controllers和views目录用作控制器和视图，但是模块下的models内的文件不支持自动载入，所以在该模块下的一些业务方法只能放在application/models目录下。</p>
<p><img loading="lazy" decoding="async" width="1416" height="583" class="wp-image-6729" src="/wp-content/uploads/2018/05/word-image-6135.png" srcset="/wp-content/uploads/2018/05/word-image-6135.png 1416w, /wp-content/uploads/2018/05/word-image-6135-300x124.png 300w, /wp-content/uploads/2018/05/word-image-6135-768x316.png 768w, /wp-content/uploads/2018/05/word-image-6135-1024x422.png 1024w" sizes="(max-width: 1416px) 100vw, 1416px" /></p>
<p>模块里面的控制器和视图同上面的控制器的使用一致。</p>
<h2>访问</h2>
<p>小写URL访问：</p>
<p>域名/index.php/模块名称/控制器名称/方法名称</p>
<h1>yaf表单-Yaf_Request_Http</h1>
<h2>简介</h2>
<p>在前后台进行交互的过程中，后端程序不可避免的需要接收用户提交的数据，常见的数据有</p>
<ol>
<li>get提交数据</li>
<li>post提交数据</li>
<li>上传文件数据</li>
<li>get查询字符串</li>
<li>cookie数据等等</li>
</ol>
<h2>数据接收</h2>
<p>在控制器里面我们可以通过$this-&gt;getRequest()来进行数据的接收，该方法返回的是<strong><em>Yaf_Request_Http</em></strong>的实例。</p>
<h1>yaf之session-Yaf_Session</h1>
<h2>简介</h2>
<p>由于http请求是无状态的，则在页面交互的过程中，有的时候我们需要跨脚本共享数据，则我们可以使用cookie或者session进行处理，session相对来说更加的安全，yaf框架内置了一个session处理类，可以非常方便的帮助我们进行session的处理。</p>
<h2>使用</h2>
<p>Yaf_Session::getInstance()-&gt;get(&#8216;name&#8217;)</p>
<h1>yaf配置篇-Yaf_Config_Ini</h1>
<h2>简介</h2>
<p>配置文件基本可以说是每个项目都会有，在配置文件中我们通常会配置数据库访问地址、redis连接、url地址等等。</p>
<p>yaf对于配置文件的解析提供了节（section）的支持，并且还支持节之间的继承功能，将节的设置和yaf运行环境（yaf.environ）结合起来就可以达到很好的配置效果，且看如何实现。</p>
<h2>php.ini配置</h2>
<p>在配置php支持yaf的时候，可以设置一个参数yaf.environ：把本地开发设置成develop、测试环境配置成test、生产环境配置成product，如：</p>
<p><img loading="lazy" decoding="async" width="593" height="226" class="wp-image-6730" src="/wp-content/uploads/2018/05/word-image-6136.png" srcset="/wp-content/uploads/2018/05/word-image-6136.png 593w, /wp-content/uploads/2018/05/word-image-6136-300x114.png 300w" sizes="(max-width: 593px) 100vw, 593px" /></p>
<h2>application.ini文件配置</h2>
<p>yaf配置文件一般都放在项目的conf文件夹下。Yaf _Application实例化的时候需要传递一个配置文件路径，假设我们的配置文件叫application.ini，先看下application.ini的结构：</p>
<p>[common]</p>
<p>; 通用配置，数据库配置</p>
<p>resources.database.params.driver = &#8220;pdo_mysql&#8221;</p>
<p>resources.database.params.hostname = &#8220;127.0.0.1&#8221;</p>
<p>resources.database.params.port = 3306</p>
<p>resources.database.params.database = &#8220;database&#8221;</p>
<p>resources.database.params.username = &#8220;username&#8221;</p>
<p>resources.database.params.password = &#8220;password&#8221;</p>
<p>[product : common]</p>
<p>; 生产环境配置，这里的配置除了节之外，节和节之间还有继承关系。例如[product : common]就表示product的配置会继承common的配置。先配置一个数据库连接看看。</p>
<p>[test : common]</p>
<p>; 测试环境配置</p>
<p>[develop : common]</p>
<p>; 开发环境配置</p>
<p>resources.database.params.hostname = &#8220;127.0.0.1&#8221;</p>
<p>resources.database.params.database = &#8220;database&#8221;</p>
<p>resources.database.params.username = &#8220;username&#8221;</p>
<p>resources.database.params.password = &#8220;password&#8221;</p>
<p>这样当项目运行环境在develop下的时候，会优先读取[develop : common]内的配置，如果没有则会从[common]中获取。在项目中任何地方都可以通过如下的方法获取application.ini里面的配置信息：</p>
<p>Yaf_Application::app()-&gt;getConfig();</p>
<h2>额外的配置</h2>
<p>随着项目越来越庞大，配置也会越来越复杂，如果都放在项目默认的配置文件application.ini中，可能配置会有好几百行，这样就不容易维护了。</p>
<p>一般我们会考虑新建配置文件用来存储额外的配置。yaf中提供了Yaf_Config_Ini类来处理这些额外的配置文件。</p>
<p>$config = new Yaf_Config_Ini( APPLICATION_PATH . &#8216;/conf/url.ini&#8217;,  ini_get(&#8216;yaf.environ&#8217;) );</p>
<h1>类的自动载入机制-libraris</h1>
<h2>简介</h2>
<p>在yaf里面类库的默认目录是application下的library目录，比如我们要写一个Page.php类文件，那么我们需要建立这样的application/library/Page.php类文件。</p>
<p>但是需要注意的是，如果我们需要目录进行嵌套，则类的名称应该是使用下划线进行连接，并且路径的首字母应该大写。</p>
<p>例如：我们打算在application/library/目录下，建议一个Dao目录，然后在该目录下建议一个Mysql目录，并在Mysql目录下建立一个Query.php类文件，则类名应该如下：</p>
<p>class Dao_Mysql_Query{</p>
<p>}</p>
<p>通过这样定义的类，yaf框架则可以根据我们的类名来获取对于的路径，实现对应的自动加载机制。</p>
<h1>助手函数扩展-Yaf_Loader</h1>
<p>在Bootstrap.php文件定义一个加载助手函数的公共方法，使用Yaf_Loader进行助手函数文件导入。</p>
<p>public function _initCommonFunctions(){</p>
<p>// 加载定义助手函数</p>
<p>Yaf_Loader::import(APPLICATION_PATH . &#8216;/application/common/functions.php&#8217;);</p>
<p>}</p>
<h1>响应-Yaf_Response_Abstract</h1>
<p>有的时候我们需要进行URL的跳转，则可以使用该类进行响应处理</p>
<h1>路由-Yaf_Route-*</h1>
<h2>简介</h2>
<p>yaf框架支持如下五种路由：</p>
<ol>
<li>Yaf_Route_Simple</li>
</ol>
<p>例如：<a href="http://local.yaf.com/index.php?m=index&amp;c=index&amp;a=index">http://local.yaf.com/index.php?m=index&amp;c=index&amp;a=index</a> （普通路由）</p>
<ol>
<li>Yaf_Route_Supervar</li>
<li>Yaf_Route_Static</li>
<li>Yaf_Route_Rewrite</li>
<li>Yaf_Route_Regex</li>
</ol>
<p>例如：http://local.yaf.com/list-12.html</p>
<h2>简单路由使用-方式一</h2>
<p>创建路由规则的步骤：</p>
<ol>
<li>在Bootstrap.php文件创建一个路由器对象</li>
<li>设置路由规则</li>
<li>调用路由对象的addRoute方法添加路由规则</li>
</ol>
<p>public function _initDefineRouter()</p>
<p>{</p>
<p>$router = Yaf_Dispatcher::getInstance()-&gt;getRouter();</p>
<p>$mac = new Yaf_Route_Simple(&#8216;m&#8217;, &#8216;c&#8217;, &#8216;a&#8217;);</p>
<p>$router-&gt;addRoute(&#8216;mac&#8217;, $mac);</p>
<p>}</p>
<h2>简单路由使用-方式二</h2>
<ol>
<li>在application.ini定义路由段</li>
</ol>
<p>[route]</p>
<p>routes.simple.type=&#8221;simple&#8221;</p>
<p>routes.simple.module=md</p>
<p>routes.simple.controller=c</p>
<p>routes.simple.action=as</p>
<p>[product:route]</p>
<ol>
<li>在Bootstrap.php里面进行配置注册</li>
</ol>
<p>public function _initConfig()</p>
<p>{</p>
<p>$config = new Yaf_Config_Ini(APPLICATION_COINFIG_FILE);</p>
<p>Yaf_Registry::set(&#8220;config&#8221;, $config);</p>
<p>}</p>
<p>public function _initDefineRouter()</p>
<p>{</p>
<p>$router = Yaf_Dispatcher::getInstance()-&gt;getRouter();</p>
<p>$router-&gt;addConfig( Yaf_Registry::get(&#8216;config&#8217;)-&gt;route-&gt;routes );</p>
<p>}</p>
<h2>正则路由-方式一</h2>
<p>1. 直接使用正则类进行生成</p>
<p>$router = Yaf_Dispatcher::getInstance()-&gt;getRouter();</p>
<p>$route = new Yaf_Route_Regex(</p>
<p>&#8216;#^/product/([a-zA-Z-_0-9]+)$#&#8217;,</p>
<p>array(</p>
<p>&#8216;module&#8217; =&gt; &#8216;index&#8217;,</p>
<p>&#8216;controller&#8217; =&gt; &#8216;index&#8217;,</p>
<p>&#8216;action&#8217; =&gt; &#8216;index&#8217;</p>
<p>),</p>
<p>array(</p>
<p>//完成数字到字符变量的映射</p>
<p>1 =&gt; &#8216;ident&#8217;</p>
<p>)</p>
<p>);</p>
<p>$router-&gt;addRoute(&#8216;reg&#8217;, $route);</p>
<h2>正则路由-方式二</h2>
<ol>
<li>在application.ini定义正则路由段</li>
</ol>
<p>[route]</p>
<p>routes.regex.type=&#8221;regex&#8221;</p>
<p>routes.regex.match=&#8221;#^/list/([0-9])+\/([a-z0-9]+)$#&#8221;</p>
<p>routes.regex.route.module=Index</p>
<p>routes.regex.route.controller=Index</p>
<p>routes.regex.route.action=index</p>
<p>routes.regex.map.1=name</p>
<p>routes.regex.map.2=value</p>
<p>[product:route]</p>
<p>2. 在Bootstrap.php里面进行配置注册</p>
<h1>相关学习资料</h1>
<p><a href="http://wiki.phpboy.net/">http://wiki.phpboy.net/</a></p>
<p><a href="http://www.phpabc.cn/yaf-kuang-jia-zhi-phpstrom-dai-ma-zi-dong-bu-quan-yaf-ide-auto-complete-2.html">http://www.phpabc.cn/yaf-kuang-jia-zhi-phpstrom-dai-ma-zi-dong-bu-quan-yaf-ide-auto-complete-2.html</a></p>
<p><a href="http://www.01happy.com/">http://www.01happy.com/</a></p>
<p><a href="http://www.widuu.com/archives/category/yaf-framework-2">http://www.widuu.com/archives/category/yaf-framework-2</a></p>
<p><a href="https://www.mengzhidu.com/">https://www.mengzhidu.com/</a></p>
<p><a href="http://www.php1.cn/detail/php-wentis-c817f8fa3d.html">http://www.php1.cn/detail/php-wentis-c817f8fa3d.html</a></p>
<p><a href="https://segmentfault.com/a/1190000004016373">https://segmentfault.com/a/1190000004016373</a></p>
<p><a href="https://devhub.io/repos/xudianyang-yaf.app">https://devhub.io/repos/xudianyang-yaf.app</a></p>
<p><a href="http://www.oss.io/p/xudianyang/yaf.app">http://www.oss.io/p/xudianyang/yaf.app</a></p>
<h1>案例演示</h1>
<p>使用yaf完成一套curd操作，同时做用户的登录和退出，可以理解完成一个后台的用户模块</p>
<h2>用户展示</h2>
<ol>
<li>定义一个init方法，完成初始化操作</li>
</ol>
<p><img loading="lazy" decoding="async" width="1762" height="752" class="wp-image-6731" src="/wp-content/uploads/2018/05/word-image-6137.png" srcset="/wp-content/uploads/2018/05/word-image-6137.png 1762w, /wp-content/uploads/2018/05/word-image-6137-300x128.png 300w, /wp-content/uploads/2018/05/word-image-6137-768x328.png 768w, /wp-content/uploads/2018/05/word-image-6137-1024x437.png 1024w" sizes="(max-width: 1762px) 100vw, 1762px" /></p>
<ol>
<li>定义一个lst方法，完成数据展示</li>
</ol>
<p><img loading="lazy" decoding="async" width="1327" height="619" class="wp-image-6732" src="/wp-content/uploads/2018/05/word-image-6138.png" srcset="/wp-content/uploads/2018/05/word-image-6138.png 1327w, /wp-content/uploads/2018/05/word-image-6138-300x140.png 300w, /wp-content/uploads/2018/05/word-image-6138-768x358.png 768w, /wp-content/uploads/2018/05/word-image-6138-1024x478.png 1024w" sizes="(max-width: 1327px) 100vw, 1327px" /></p>
<ol>
<li>定义一个lst.phtml视图文件</li>
</ol>
<p><img loading="lazy" decoding="async" width="1857" height="941" class="wp-image-6733" src="/wp-content/uploads/2018/05/word-image-6139.png" srcset="/wp-content/uploads/2018/05/word-image-6139.png 1857w, /wp-content/uploads/2018/05/word-image-6139-300x152.png 300w, /wp-content/uploads/2018/05/word-image-6139-768x389.png 768w, /wp-content/uploads/2018/05/word-image-6139-1024x519.png 1024w" sizes="(max-width: 1857px) 100vw, 1857px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="1213" height="728" class="wp-image-6734" src="/wp-content/uploads/2018/05/word-image-6140.png" srcset="/wp-content/uploads/2018/05/word-image-6140.png 1213w, /wp-content/uploads/2018/05/word-image-6140-300x180.png 300w, /wp-content/uploads/2018/05/word-image-6140-768x461.png 768w, /wp-content/uploads/2018/05/word-image-6140-1024x615.png 1024w" sizes="(max-width: 1213px) 100vw, 1213px" /></p>
<h2>用户添加</h2>
<ol>
<li>定义一个add方法，完成用户添加</li>
</ol>
<p><img loading="lazy" decoding="async" width="1615" height="961" class="wp-image-6735" src="/wp-content/uploads/2018/05/word-image-6141.png" srcset="/wp-content/uploads/2018/05/word-image-6141.png 1615w, /wp-content/uploads/2018/05/word-image-6141-300x179.png 300w, /wp-content/uploads/2018/05/word-image-6141-768x457.png 768w, /wp-content/uploads/2018/05/word-image-6141-1024x609.png 1024w" sizes="(max-width: 1615px) 100vw, 1615px" /></p>
<ol>
<li>定义一个add.phtml视图文件，展示添加表单</li>
</ol>
<p><img loading="lazy" decoding="async" width="1862" height="962" class="wp-image-6736" src="/wp-content/uploads/2018/05/word-image-6142.png" srcset="/wp-content/uploads/2018/05/word-image-6142.png 1862w, /wp-content/uploads/2018/05/word-image-6142-300x155.png 300w, /wp-content/uploads/2018/05/word-image-6142-768x397.png 768w, /wp-content/uploads/2018/05/word-image-6142-1024x529.png 1024w" sizes="(max-width: 1862px) 100vw, 1862px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="926" height="730" class="wp-image-6737" src="/wp-content/uploads/2018/05/word-image-6143.png" srcset="/wp-content/uploads/2018/05/word-image-6143.png 926w, /wp-content/uploads/2018/05/word-image-6143-300x237.png 300w, /wp-content/uploads/2018/05/word-image-6143-768x605.png 768w" sizes="(max-width: 926px) 100vw, 926px" /></p>
<h2>用户删除</h2>
<ol>
<li>定义一个del方法，完成用户删除</li>
</ol>
<p><img loading="lazy" decoding="async" width="1453" height="766" class="wp-image-6738" src="/wp-content/uploads/2018/05/word-image-6144.png" srcset="/wp-content/uploads/2018/05/word-image-6144.png 1453w, /wp-content/uploads/2018/05/word-image-6144-300x158.png 300w, /wp-content/uploads/2018/05/word-image-6144-768x405.png 768w, /wp-content/uploads/2018/05/word-image-6144-1024x540.png 1024w" sizes="(max-width: 1453px) 100vw, 1453px" /></p>
<h2>用户编辑</h2>
<ol>
<li>定义一个edt方法，完成用户编辑</li>
</ol>
<p><img loading="lazy" decoding="async" width="1420" height="1002" class="wp-image-6739" src="/wp-content/uploads/2018/05/word-image-6145.png" srcset="/wp-content/uploads/2018/05/word-image-6145.png 1420w, /wp-content/uploads/2018/05/word-image-6145-300x212.png 300w, /wp-content/uploads/2018/05/word-image-6145-768x542.png 768w, /wp-content/uploads/2018/05/word-image-6145-1024x723.png 1024w" sizes="(max-width: 1420px) 100vw, 1420px" /></p>
<ol>
<li>定义一个edt.phtml视图页面，展示待编辑的数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1867" height="974" class="wp-image-6740" src="/wp-content/uploads/2018/05/word-image-6146.png" srcset="/wp-content/uploads/2018/05/word-image-6146.png 1867w, /wp-content/uploads/2018/05/word-image-6146-300x157.png 300w, /wp-content/uploads/2018/05/word-image-6146-768x401.png 768w, /wp-content/uploads/2018/05/word-image-6146-1024x534.png 1024w" sizes="(max-width: 1867px) 100vw, 1867px" /></p>
<p>效果</p>
<p><img loading="lazy" decoding="async" width="930" height="590" class="wp-image-6741" src="/wp-content/uploads/2018/05/word-image-6147.png" srcset="/wp-content/uploads/2018/05/word-image-6147.png 930w, /wp-content/uploads/2018/05/word-image-6147-300x190.png 300w, /wp-content/uploads/2018/05/word-image-6147-768x487.png 768w" sizes="(max-width: 930px) 100vw, 930px" /></p>
<h2>用户登录</h2>
<ol>
<li>定义一个login方法，完成用户的登录处理</li>
</ol>
<p><img loading="lazy" decoding="async" width="1640" height="888" class="wp-image-6742" src="/wp-content/uploads/2018/05/word-image-6148.png" srcset="/wp-content/uploads/2018/05/word-image-6148.png 1640w, /wp-content/uploads/2018/05/word-image-6148-300x162.png 300w, /wp-content/uploads/2018/05/word-image-6148-768x416.png 768w, /wp-content/uploads/2018/05/word-image-6148-1024x554.png 1024w" sizes="(max-width: 1640px) 100vw, 1640px" /></p>
<h2>用户退出</h2>
<ol>
<li>定义一个logout方法，完成用户退出</li>
</ol>
<p><img loading="lazy" decoding="async" width="1898" height="922" class="wp-image-6743" src="/wp-content/uploads/2018/05/word-image-6149.png" srcset="/wp-content/uploads/2018/05/word-image-6149.png 1898w, /wp-content/uploads/2018/05/word-image-6149-300x146.png 300w, /wp-content/uploads/2018/05/word-image-6149-768x373.png 768w, /wp-content/uploads/2018/05/word-image-6149-1024x497.png 1024w" sizes="(max-width: 1898px) 100vw, 1898px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6500.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>yii2 框架 安装、目录介绍、路由、模型、视图、控制器、留言板案例</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6297.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6297.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 17:28:10 +0000</pubDate>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[控制器]]></category>
		<category><![CDATA[模型]]></category>
		<category><![CDATA[留言板案例]]></category>
		<category><![CDATA[目录介绍]]></category>
		<category><![CDATA[视图]]></category>
		<category><![CDATA[路由]]></category>
		<guid isPermaLink="false">/?p=6297</guid>

					<description><![CDATA[Yii2框架 一、Yii2框架 1、什么是Yii2易框架 就是用PHP语言开发的框架 PHP框架区别和常见问题 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><a id="post-6297-_Toc487903166"></a>Yii2框架</h1>
<h1><a id="post-6297-_Toc487990951"></a>一、Yii2框架</h1>
<h2>1、什么是Yii2易框架</h2>
<p>
  就是用PHP语言开发的框架
</p>
<h2>PHP框架区别和常见问题</h2>
<h3>1）常用PHP框架</h3>
<p><img loading="lazy" decoding="async" width="151" height="51" src="/wp-content/uploads/2018/05/word-image-5740.png" class="wp-image-6298" srcset="/wp-content/uploads/2018/05/word-image-5740.png 151w, /wp-content/uploads/2018/05/word-image-5740-150x51.png 150w" sizes="(max-width: 151px) 100vw, 151px" /><br />
<img loading="lazy" decoding="async" width="290" height="70" src="/wp-content/uploads/2018/05/word-image-5741.png" class="wp-image-6299" /><br />
<img loading="lazy" decoding="async" width="307" height="77" src="/wp-content/uploads/2018/05/word-image-5742.png" class="wp-image-6300" srcset="/wp-content/uploads/2018/05/word-image-5742.png 307w, /wp-content/uploads/2018/05/word-image-5742-300x75.png 300w" sizes="(max-width: 307px) 100vw, 307px" /><br />
<img loading="lazy" decoding="async" width="253" height="53" src="/wp-content/uploads/2018/05/word-image-5743.png" class="wp-image-6301" /><br />
<img loading="lazy" decoding="async" width="286" height="97" src="/wp-content/uploads/2018/05/word-image-5744.png" class="wp-image-6302" /></p>
<p>
  C语言开发
</p>
<p><img loading="lazy" decoding="async" width="187" height="60" src="/wp-content/uploads/2018/05/word-image-5745.png" class="wp-image-6303" /><br />
<img loading="lazy" decoding="async" width="101" height="66" src="/wp-content/uploads/2018/05/word-image-5746.png" class="wp-image-6304" /></p>
<h3>2）常见问题</h3>
<p>
  问：你觉得XXX框架是轻量级还是重量级？
</p>
<p>
  答：框架帮你做的事越多，框架越重。（其次：设计是否复杂？ 运行速度？ 更接近原生？）
</p>
<p>
  问：一般设计框架的时候都需要权衡？
</p>
<p>
  答：开发效率和运行效率（yaf、Phalcon）。
</p>
<h1>下载并安装</h1>
<h2>︴网址</h2>
<p>
  官网：<a href="/goto/w8q1" rel="nofollow">http://www.yiiframework.com/</a>
</p>
<p>
  中文：<a href="/goto/g3cr" rel="nofollow">http://www.yiichina.com/</a>
</p>
<h2>︴下载</h2>
<p><img loading="lazy" decoding="async" width="516" height="342" src="/wp-content/uploads/2018/05/word-image-5747.png" class="wp-image-6305" srcset="/wp-content/uploads/2018/05/word-image-5747.png 516w, /wp-content/uploads/2018/05/word-image-5747-300x199.png 300w" sizes="(max-width: 516px) 100vw, 516px" /><br />
<img loading="lazy" decoding="async" width="241" height="54" src="/wp-content/uploads/2018/05/word-image-5748.png" class="wp-image-6306" /></p>
<h2>︴使用</h2>
<ul>
<li>
    步骤1：解压到指定目录中
  </li>
<li>
    步骤2：初始化，通过命令【php init】
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="684" height="303" src="/wp-content/uploads/2018/05/word-image-5749.png" class="wp-image-6307" srcset="/wp-content/uploads/2018/05/word-image-5749.png 684w, /wp-content/uploads/2018/05/word-image-5749-300x133.png 300w" sizes="(max-width: 684px) 100vw, 684px" /></p>
<ul>
<li>
    步骤3：访问
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1058" height="594" src="/wp-content/uploads/2018/05/word-image-5750.png" class="wp-image-6308" srcset="/wp-content/uploads/2018/05/word-image-5750.png 1058w, /wp-content/uploads/2018/05/word-image-5750-300x168.png 300w, /wp-content/uploads/2018/05/word-image-5750-768x431.png 768w, /wp-content/uploads/2018/05/word-image-5750-1024x575.png 1024w" sizes="(max-width: 1058px) 100vw, 1058px" /></p>
<h1>三、目录介绍</h1>
<p><img loading="lazy" decoding="async" width="306" height="544" src="/wp-content/uploads/2018/05/word-image-5751.png" class="wp-image-6309" srcset="/wp-content/uploads/2018/05/word-image-5751.png 306w, /wp-content/uploads/2018/05/word-image-5751-169x300.png 169w" sizes="(max-width: 306px) 100vw, 306px" /></p>
<h1>四、控制器</h1>
<p><a href="/goto/7a3e" rel="nofollow">http://l.com/yii2/frontend/web/index.php?r=test/index</a>
</p>
<p><img loading="lazy" decoding="async" width="705" height="559" src="/wp-content/uploads/2018/05/word-image-5752.png" class="wp-image-6310" srcset="/wp-content/uploads/2018/05/word-image-5752.png 705w, /wp-content/uploads/2018/05/word-image-5752-300x238.png 300w" sizes="(max-width: 705px) 100vw, 705px" /></p>
<h1>路由</h1>
<h2>路由访问规则</h2>
<p>
  域名/index.php?r=控制器名/方法名
</p>
<p><img loading="lazy" decoding="async" width="840" height="599" src="/wp-content/uploads/2018/05/word-image-5753.png" class="wp-image-6311" srcset="/wp-content/uploads/2018/05/word-image-5753.png 840w, /wp-content/uploads/2018/05/word-image-5753-300x214.png 300w, /wp-content/uploads/2018/05/word-image-5753-768x548.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace frontend\controllers;
</p>
<p>
  use Yii;
</p>
<p>
  use yii\web\Controller;
</p>
<p>
  /**
</p>
<p>
   * 测试控制器
</p>
<p>
   */
</p>
<p>
  class TestController extends Controller
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * Displays homepage.
</p>
<p>
       *
</p>
<p>
       * @return mixed
</p>
<p>
       */
</p>
<p>
      public function actionIndex()
</p>
<p>
      {
</p>
<p>
          echo 66666;die;
</p>
<p>
          return $this-&gt;render(&#8216;index&#8217;);
</p>
<p>
      }
</p>
<p>
      public function actionAdd()
</p>
<p>
      {
</p>
<p>
          echo 7777777777;die;
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  脚下留心：方法前缀必须是action开头
</p>
<h2>美化路由（自定义路由）</h2>
<p><img loading="lazy" decoding="async" width="834" height="390" src="/wp-content/uploads/2018/05/word-image-5754.png" class="wp-image-6312" srcset="/wp-content/uploads/2018/05/word-image-5754.png 834w, /wp-content/uploads/2018/05/word-image-5754-300x140.png 300w, /wp-content/uploads/2018/05/word-image-5754-768x359.png 768w" sizes="(max-width: 834px) 100vw, 834px" /><br />
<img loading="lazy" decoding="async" width="981" height="662" src="/wp-content/uploads/2018/05/word-image-5755.png" class="wp-image-6313" srcset="/wp-content/uploads/2018/05/word-image-5755.png 981w, /wp-content/uploads/2018/05/word-image-5755-300x202.png 300w, /wp-content/uploads/2018/05/word-image-5755-768x518.png 768w" sizes="(max-width: 981px) 100vw, 981px" /></p>
<h1>六、视图</h1>
<h2>1、语法</h2>
<p>
  加载视图并传递数据（数组中的键后期在视图中直接当变量使用）
</p>
<p>
  return $this-&gt;render(&#8216;index&#8217;, [
</p>
<p>
      &#8216;test1&#8217; =&gt; 111,
</p>
<p>
      &#8216;test2&#8217; =&gt; &#8216;dsfsdfa&#8217;,
</p>
<p>
      &#8216;test3&#8217; =&gt; array(&#8216;name&#8217;, 666, &#8216;aaa&#8217;)
</p>
<p>
  ]);
</p>
<p>
  模板显示数据通过&lt;?= $变量名 ?&gt; （注：&lt;?=   相当于  &lt;?php echo ）
</p>
<h2>2、练习</h2>
<p><img loading="lazy" decoding="async" width="961" height="627" src="/wp-content/uploads/2018/05/word-image-5756.png" class="wp-image-6314" srcset="/wp-content/uploads/2018/05/word-image-5756.png 961w, /wp-content/uploads/2018/05/word-image-5756-300x196.png 300w, /wp-content/uploads/2018/05/word-image-5756-768x501.png 768w" sizes="(max-width: 961px) 100vw, 961px" /><br />
<img loading="lazy" decoding="async" width="783" height="575" src="/wp-content/uploads/2018/05/word-image-5757.png" class="wp-image-6315" srcset="/wp-content/uploads/2018/05/word-image-5757.png 783w, /wp-content/uploads/2018/05/word-image-5757-300x220.png 300w, /wp-content/uploads/2018/05/word-image-5757-768x564.png 768w" sizes="(max-width: 783px) 100vw, 783px" /></p>
<h1>七、模型</h1>
<h2>1、准备</h2>
<ul>
<li>
    模型使用手册：<a href="/goto/cbx3" rel="nofollow">http://blog.csdn.net/ww_smile7/article/details/53410166</a>
  </li>
<li>
    设置数据库配置文件
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1106" height="496" src="/wp-content/uploads/2018/05/word-image-5758.png" class="wp-image-6316" srcset="/wp-content/uploads/2018/05/word-image-5758.png 1106w, /wp-content/uploads/2018/05/word-image-5758-300x135.png 300w, /wp-content/uploads/2018/05/word-image-5758-768x344.png 768w, /wp-content/uploads/2018/05/word-image-5758-1024x459.png 1024w" sizes="(max-width: 1106px) 100vw, 1106px" /></p>
<ul>
<li>
    定义模型
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="809" height="419" src="/wp-content/uploads/2018/05/word-image-5759.png" class="wp-image-6317" srcset="/wp-content/uploads/2018/05/word-image-5759.png 809w, /wp-content/uploads/2018/05/word-image-5759-300x155.png 300w, /wp-content/uploads/2018/05/word-image-5759-768x398.png 768w" sizes="(max-width: 809px) 100vw, 809px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace common\models;
</p>
<p>
  use Yii;
</p>
<p>
  use yii\db\ActiveRecord;
</p>
<p>
  /**
</p>
<p>
   * Login form
</p>
<p>
   */
</p>
<p>
  class Php12 extends ActiveRecord
</p>
<p>
  {
</p>
</p>
<p>
  }
</p>
<h2>2、练习</h2>
<p>
  查询所有
</p>
<p><img loading="lazy" decoding="async" width="1069" height="666" src="/wp-content/uploads/2018/05/word-image-5760.png" class="wp-image-6318" srcset="/wp-content/uploads/2018/05/word-image-5760.png 1069w, /wp-content/uploads/2018/05/word-image-5760-300x187.png 300w, /wp-content/uploads/2018/05/word-image-5760-768x478.png 768w, /wp-content/uploads/2018/05/word-image-5760-1024x638.png 1024w" sizes="(max-width: 1069px) 100vw, 1069px" /></p>
<p>
  查询一条
</p>
<p><img loading="lazy" decoding="async" width="954" height="521" src="/wp-content/uploads/2018/05/word-image-5761.png" class="wp-image-6319" srcset="/wp-content/uploads/2018/05/word-image-5761.png 954w, /wp-content/uploads/2018/05/word-image-5761-300x164.png 300w, /wp-content/uploads/2018/05/word-image-5761-768x419.png 768w" sizes="(max-width: 954px) 100vw, 954px" /><br />
<img loading="lazy" decoding="async" width="1131" height="514" src="/wp-content/uploads/2018/05/word-image-5762.png" class="wp-image-6320" srcset="/wp-content/uploads/2018/05/word-image-5762.png 1131w, /wp-content/uploads/2018/05/word-image-5762-300x136.png 300w, /wp-content/uploads/2018/05/word-image-5762-768x349.png 768w, /wp-content/uploads/2018/05/word-image-5762-1024x465.png 1024w" sizes="(max-width: 1131px) 100vw, 1131px" /></p>
<p>
  插入
</p>
<p><img loading="lazy" decoding="async" width="1316" height="542" src="/wp-content/uploads/2018/05/word-image-5763.png" class="wp-image-6321" srcset="/wp-content/uploads/2018/05/word-image-5763.png 1316w, /wp-content/uploads/2018/05/word-image-5763-300x124.png 300w, /wp-content/uploads/2018/05/word-image-5763-768x316.png 768w, /wp-content/uploads/2018/05/word-image-5763-1024x422.png 1024w" sizes="(max-width: 1316px) 100vw, 1316px" /></p>
<h1>八、留言板案例</h1>
<h2>︴效果</h2>
<p><img loading="lazy" decoding="async" width="397" height="436" src="/wp-content/uploads/2018/05/word-image-5764.png" class="wp-image-6322" srcset="/wp-content/uploads/2018/05/word-image-5764.png 397w, /wp-content/uploads/2018/05/word-image-5764-273x300.png 273w" sizes="(max-width: 397px) 100vw, 397px" /><br />
<img loading="lazy" decoding="async" width="386" height="315" src="/wp-content/uploads/2018/05/word-image-5765.png" class="wp-image-6323" srcset="/wp-content/uploads/2018/05/word-image-5765.png 386w, /wp-content/uploads/2018/05/word-image-5765-300x245.png 300w" sizes="(max-width: 386px) 100vw, 386px" /></p>
<h2>︴代码</h2>
<h3>准备</h3>
<ul>
<li>
    创建表
  </li>
</ul>
<p>
  create table msg (
</p>
<p>
  id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  title varchar(60) not null comment &#8216;标题&#8217;,
</p>
<p>
  `desc` text comment &#8216;描述&#8217;,
</p>
<p>
  created_at int default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  updated_at int default 0 comment &#8216;更新于&#8217;
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<ul>
<li>
    创建模型
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="606" height="340" src="/wp-content/uploads/2018/05/word-image-5766.png" class="wp-image-6324" srcset="/wp-content/uploads/2018/05/word-image-5766.png 606w, /wp-content/uploads/2018/05/word-image-5766-300x168.png 300w" sizes="(max-width: 606px) 100vw, 606px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace common\models;
</p>
<p>
  use Yii;
</p>
<p>
  use yii\db\ActiveRecord;
</p>
<p>
  /**
</p>
<p>
   * Login form
</p>
<p>
   */
</p>
<p>
  class Msg extends ActiveRecord
</p>
<p>
  {
</p>
</p>
<p>
  }
</p>
<h3>列表功能</h3>
<ul>
<li>
    步骤1：定义路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="904" height="489" src="/wp-content/uploads/2018/05/word-image-5767.png" class="wp-image-6325" srcset="/wp-content/uploads/2018/05/word-image-5767.png 904w, /wp-content/uploads/2018/05/word-image-5767-300x162.png 300w, /wp-content/uploads/2018/05/word-image-5767-768x415.png 768w" sizes="(max-width: 904px) 100vw, 904px" /></p>
<ul>
<li>
    步骤2：创建控制器方法、查询所有留言数据并传递给视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="762" height="715" src="/wp-content/uploads/2018/05/word-image-5768.png" class="wp-image-6326" srcset="/wp-content/uploads/2018/05/word-image-5768.png 762w, /wp-content/uploads/2018/05/word-image-5768-300x281.png 300w" sizes="(max-width: 762px) 100vw, 762px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace frontend\controllers;
</p>
<p>
  use Yii;
</p>
<p>
  use common\models\Msg;
</p>
<p>
  use yii\web\Controller;
</p>
<p>
  /**
</p>
<p>
   * 测试控制器
</p>
<p>
   */
</p>
<p>
  class MsgController extends Controller
</p>
<p>
  {
</p>
<p>
      //说明laravel框架有layout模板机制
</p>
<p>
      //声明属性决定layout是否使用
</p>
<p>
      //当前控制器都生效
</p>
<p>
      public $layout = false;
</p>
<p>
      public function actionIndex()
</p>
<p>
      {
</p>
<p>
          //1.查询数据通过模型
</p>
<p>
          $msgs = Msg::find()-&gt;all();
</p>
<p>
          //2.加载视图并传递数据
</p>
<p>
          return $this-&gt;render(&#8216;index&#8217;, [
</p>
<p>
              &#8216;msgs&#8217; =&gt; $msgs
</p>
<p>
          ]);
</p>
<p>
      }
</p>
<p>
  }
</p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1180" height="697" src="/wp-content/uploads/2018/05/word-image-5769.png" class="wp-image-6328" srcset="/wp-content/uploads/2018/05/word-image-5769.png 1180w, /wp-content/uploads/2018/05/word-image-5769-300x177.png 300w, /wp-content/uploads/2018/05/word-image-5769-768x454.png 768w, /wp-content/uploads/2018/05/word-image-5769-1024x605.png 1024w" sizes="(max-width: 1180px) 100vw, 1180px" /></p>
<ul>
<li>
    步骤4：循环显示数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1098" height="496" src="/wp-content/uploads/2018/05/word-image-5770.png" class="wp-image-6329" srcset="/wp-content/uploads/2018/05/word-image-5770.png 1098w, /wp-content/uploads/2018/05/word-image-5770-300x136.png 300w, /wp-content/uploads/2018/05/word-image-5770-768x347.png 768w, /wp-content/uploads/2018/05/word-image-5770-1024x463.png 1024w" sizes="(max-width: 1098px) 100vw, 1098px" /></p>
<p>
  &lt;!DOCTYPE html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  	&lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=utf-8&#8243; /&gt;
</p>
<p>
  	&lt;meta content=&#8221;telephone=no, address=no&#8221; name=&#8221;format-detection&#8221;&gt;
</p>
<p>
  	&lt;meta content=&#8221;width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no&#8221; name=&#8221;viewport&#8221;&gt;
</p>
<p>
      &lt;title&gt;微留言演示案例&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;./message/msg.css&#8221; media=&#8221;all&#8221; /&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body id=&#8221;message&#8221; onselectstart=&#8221;return true;&#8221; ondragstart=&#8221;return false;&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;container&#8221;&gt;
</p>
<p>
  	  	&lt;div class=&#8221;qiandaobanner&#8221;&gt;
</p>
<p>
  		  	&lt;a href=&#8221;./message&#8221;&gt;
</p>
<p>
  		  		&lt;img src=&#8221;./message/wall.jpg&#8221; style=&#8221;width:100%;&#8221; /&gt;
</p>
<p>
  		  	&lt;/a&gt;
</p>
<p>
  	  	&lt;/div&gt;
</p>
<p>
  		&lt;div class=&#8221;cardexplain&#8221;&gt;
</p>
<p>
  			&lt;div class=&#8221;window&#8221; id=&#8221;windowcenter&#8221;&gt;
</p>
<p>
  				&lt;div id=&#8221;title&#8221; class=&#8221;wtitle&#8221;&gt;操作提示&lt;span class=&#8221;close&#8221; id=&#8221;alertclose&#8221;&gt;&lt;/span&gt;&lt;/div&gt;
</p>
<p>
  				&lt;div class=&#8221;content&#8221;&gt;
</p>
<p>
  					&lt;div id=&#8221;txt&#8221;&gt;&lt;/div&gt;
</p>
<p>
  				&lt;/div&gt;
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
    			&lt;div class=&#8221;history&#8221;&gt;
</p>
<p>
  				&lt;div class=&#8221;history-date&#8221;&gt;
</p>
<p>
  					&lt;ul&gt;
</p>
<p>
  						&lt;?php foreach ($msgs as $msg) :  ?&gt;
</p>
<p>
  						&lt;li class=&#8221;green bounceInDown&#8221;&gt;
</p>
<p>
  							&lt;h3&gt;
</p>
<p>
  								&lt;img src=&#8221;./message/logo100x100.jpg&#8221;&gt;
</p>
<p>
  								&lt;?= $msg-&gt;title ?&gt;
</p>
<p>
  								&lt;span&gt;&lt;?= date(&#8216;Y-m-d&#8217;, $msg-&gt;created_at) ?&gt;&lt;/span&gt;
</p>
<p>
  								&lt;div class=&#8221;clr&#8221;&gt;&lt;/div&gt;
</p>
<p>
  							&lt;/h3&gt;
</p>
<p>
  							&lt;dl&gt;
</p>
<p>
  								&lt;dt class=&#8221;hfinfo&#8221;&gt;&lt;?= $msg-&gt;desc ?&gt;&lt;/dt&gt;
</p>
<p>
  							&lt;/dl&gt;
</p>
<p>
  						&lt;/li&gt;
</p>
<p>
  						&lt;?php  endforeach; ?&gt;
</p>
<p>
  						&lt;li class=&#8221;green bounceInDown nob ly2&#8243; style=&#8221;display:none;&#8221;&gt;
</p>
<p>
  							&lt;form action=&#8221;&#8221; method=&#8221;post&#8221; class=&#8221;form1&#8243;&gt;
</p>
<p>
  							&lt;dl&gt;
</p>
<p>
  								&lt;dt&gt;
</p>
<p>
  									&lt;input name=&#8221;uname&#8221; type=&#8221;text&#8221; class=&#8221;px&#8221; id=&#8221;uname&#8221; value=&#8221;&#8221; placeholder=&#8221;请输入您的昵称&#8221;&gt;
</p>
<p>
  									&lt;/dt&gt;
</p>
<p>
  								&lt;dt&gt;
</p>
<p>
  									&lt;textarea name=&#8221;content&#8221; class=&#8221;pxtextarea&#8221; style=&#8221; height:60px;&#8221; id=&#8221;content&#8221; placeholder=&#8221;请输入留言内容&#8221;&gt;&lt;/textarea&gt;
</p>
<p>
  								&lt;/dt&gt;
</p>
<p>
  								&lt;dt&gt;
</p>
<p>
  									&lt;a class=&#8221;submit&#8221; href=&#8221;javascript:void(0);&#8221;&gt;提交留言&lt;/a&gt;
</p>
<p>
  								&lt;/dt&gt;
</p>
<p>
  							&lt;/dl&gt;
</p>
<p>
  							&lt;/form&gt;
</p>
<p>
  						&lt;/li&gt;
</p>
<p>
  						&lt;a&gt;&lt;h2 class=&#8221;first first2&#8243; style=&#8221;position: relative;&#8221;&gt;点击留言&lt;/h2&gt;&lt;/a&gt;
</p>
<p>
  					&lt;/ul&gt;
</p>
<p>
  				&lt;/div&gt;
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;script type=&#8221;text/javascript&#8221; src=&#8221;./message/jquery.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  	&lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  		$(function(){
</p>
<p>
  			//留言表单显示切换
</p>
<p>
  			$(&#8220;.first1&#8221;).click(function(){
</p>
<p>
  				$(&#8220;.ly1&#8221;).slideToggle();
</p>
<p>
  			});
</p>
<p>
  			$(&#8220;.first2&#8221;).click(function(){
</p>
<p>
  				$(&#8220;.ly2&#8221;).slideToggle();
</p>
<p>
  			});
</p>
<p>
  			//点击提交留言a标签，则提交表单
</p>
<p>
  			$(&#8216;.submit&#8217;).click(function(){
</p>
<p>
  				//判断用户名和密码不能为空
</p>
<p>
  				var uname = $(&#8216;#uname&#8217;).val();
</p>
<p>
  				var content = $(&#8216;#content&#8217;).val();
</p>
<p>
  				if (uname == &#8221; || content == &#8221;) {
</p>
<p>
  					alert(&#8216;请输入昵称或留言内容&#8217;);
</p>
<p>
  					return;
</p>
<p>
  				}
</p>
<p>
  				//提交表单
</p>
<p>
  				$(&#8216;.form1&#8217;).submit();
</p>
<p>
  			});
</p>
<p>
  		});
</p>
<p>
  	&lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h3>添加功能</h3>
<ul>
<li>
    定义路由处理添加数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="756" height="472" src="/wp-content/uploads/2018/05/word-image-5771.png" class="wp-image-6330" srcset="/wp-content/uploads/2018/05/word-image-5771.png 756w, /wp-content/uploads/2018/05/word-image-5771-300x187.png 300w" sizes="(max-width: 756px) 100vw, 756px" /></p>
<ul>
<li>
    创建控制器方法处理数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="818" height="661" src="/wp-content/uploads/2018/05/word-image-5772.png" class="wp-image-6331" srcset="/wp-content/uploads/2018/05/word-image-5772.png 818w, /wp-content/uploads/2018/05/word-image-5772-300x242.png 300w, /wp-content/uploads/2018/05/word-image-5772-768x621.png 768w" sizes="(max-width: 818px) 100vw, 818px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace frontend\controllers;
</p>
<p>
  use Yii;
</p>
<p>
  use common\models\Msg;
</p>
<p>
  use yii\web\Controller;
</p>
<p>
  /**
</p>
<p>
   * 测试控制器
</p>
<p>
   */
</p>
<p>
  class MsgController extends Controller
</p>
<p>
  {
</p>
<p>
      //说明laravel框架有layout模板机制
</p>
<p>
      //声明属性决定layout是否使用
</p>
<p>
      //当前控制器都生效
</p>
<p>
      public $layout = false;
</p>
<p>
      //关闭cstf验证
</p>
<p>
      public $enableCsrfValidation = false;
</p>
<p>
      //添加
</p>
<p>
      public function actionCreate()
</p>
<p>
      {
</p>
<p>
          //1.判断是否post提交
</p>
<p>
          if (Yii::$app-&gt;request-&gt;isPost) {
</p>
<p>
              //2.接受数据
</p>
<p>
              $title = Yii::$app-&gt;request-&gt;post(&#8216;uname&#8217;);
</p>
<p>
              $desc = Yii::$app-&gt;request-&gt;post(&#8216;content&#8217;);
</p>
<p>
              //3.实例化对象并保存数据
</p>
<p>
              $msg = new Msg;
</p>
<p>
              $msg-&gt;title = $title;
</p>
<p>
              $msg-&gt;desc = $desc;
</p>
<p>
              $msg-&gt;created_at = time();
</p>
<p>
              $msg-&gt;updated_at = time();
</p>
<p>
              $rs = $msg-&gt;save();
</p>
<p>
              return $this-&gt;redirect([&#8216;/msg&#8217;]);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      //列表
</p>
<p>
      public function actionIndex()
</p>
<p>
      {
</p>
<p>
          //1.查询数据通过模型
</p>
<p>
          $msgs = Msg::find()-&gt;all();
</p>
<p>
          //2.加载视图并传递数据
</p>
<p>
          return $this-&gt;render(&#8216;index&#8217;, [
</p>
<p>
              &#8216;msgs&#8217; =&gt; $msgs
</p>
<p>
          ]);
</p>
<p>
      }
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="717" height="382" src="/wp-content/uploads/2018/05/word-image-5773.png" class="wp-image-6332" srcset="/wp-content/uploads/2018/05/word-image-5773.png 717w, /wp-content/uploads/2018/05/word-image-5773-300x160.png 300w" sizes="(max-width: 717px) 100vw, 717px" /><br />
<img loading="lazy" decoding="async" width="792" height="446" src="/wp-content/uploads/2018/05/word-image-5774.png" class="wp-image-6333" srcset="/wp-content/uploads/2018/05/word-image-5774.png 792w, /wp-content/uploads/2018/05/word-image-5774-300x169.png 300w, /wp-content/uploads/2018/05/word-image-5774-768x432.png 768w" sizes="(max-width: 792px) 100vw, 792px" /></p>
<p>
  多学一招：
</p>
<p>
  Yii::$app-&gt;request-&gt;isPost
</p>
<p>
  Yii::$app-&gt;request-&gt;post(键)</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6297.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravel框架（一）安装、Composer、目录结构、路由、模型、视图、控制器</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6202.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6202.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 16:19:00 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[控制器]]></category>
		<category><![CDATA[模型]]></category>
		<category><![CDATA[目录结构]]></category>
		<category><![CDATA[视图]]></category>
		<category><![CDATA[路由]]></category>
		<guid isPermaLink="false">/?p=6202</guid>

					<description><![CDATA[Laravel框架第1天 一、Laravel概述 1、Laravel框架简介 Laravel是一套简洁、优雅的 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>Laravel框架第1天</h1>
<h1>一、Laravel概述</h1>
<h2>1、Laravel框架简介</h2>
<ul>
<li>
    Laravel是一套简洁、优雅的PHP WEB开发框架（目前最流行的PHP框架，
  </li>
</ul>
<p>
  基于symfony开发）
</p>
<ul>
<li>
    具有富于表达性且简洁的语法。更加语意化
  </li>
<li>
    Laravel是易于理解且强大的，它提供了强大的工具用于开发大型、健壮的应用，如：
  </li>
</ul>
<p>
  验证、反向路由、会话技术、缓存、数据迁移、单元测试等等常用工具和功能
</p>
<h2>2、什么是Laravel</h2>
<p>
  就是用PHP写的框架
</p>
<h2>3、Laravel框架相对于其他框架优势</h2>
<p>
  强大路由（route）
</p>
<p>
  命令行工具（artisan）：加快项目开发（很多手动的工作都自动了）
</p>
<p>
  blade模版：可继承、渲染速度快、简化view开发和管理
</p>
<p>
  数据迁移（Migrations）: 管理数据库和版本控制
</p>
<p>
  单元测试（PHPUnit）：保证稳定性（便于发现问题，无论是需求更变还是代码本
</p>
<p>
  身的bug及代码重构）
</p>
<p>
  支持Composer：项目组件管理工具
</p>
<h1>二、Laravel的安装</h1>
<h2> 准备：PHP运行环境</h2>
<h3>a. 环境要求</h3>
<p><img loading="lazy" decoding="async" width="321" height="133" src="/wp-content/uploads/2018/05/word-image-5647.png" class="wp-image-6203" srcset="/wp-content/uploads/2018/05/word-image-5647.png 321w, /wp-content/uploads/2018/05/word-image-5647-300x124.png 300w" sizes="(max-width: 321px) 100vw, 321px" /></p>
<h3>b. 通过phpStudy搭建PHP运行环境</h3>
<p><img loading="lazy" decoding="async" width="557" height="339" src="/wp-content/uploads/2018/05/word-image-5648.png" class="wp-image-6204" srcset="/wp-content/uploads/2018/05/word-image-5648.png 557w, /wp-content/uploads/2018/05/word-image-5648-300x183.png 300w" sizes="(max-width: 557px) 100vw, 557px" /><br />
<img loading="lazy" decoding="async" width="290" height="125" src="/wp-content/uploads/2018/05/word-image-5649.png" class="wp-image-6205" /><br />
<img loading="lazy" decoding="async" width="395" height="346" src="/wp-content/uploads/2018/05/word-image-5650.png" class="wp-image-6206" srcset="/wp-content/uploads/2018/05/word-image-5650.png 395w, /wp-content/uploads/2018/05/word-image-5650-300x263.png 300w" sizes="(max-width: 395px) 100vw, 395px" /></p>
<h3>c. PHP相关配置（修改并保存）</h3>
<p><strong>1）切换PHP版本</strong>
</p>
<p><img loading="lazy" decoding="async" width="890" height="659" src="/wp-content/uploads/2018/05/word-image-5651.png" class="wp-image-6207" srcset="/wp-content/uploads/2018/05/word-image-5651.png 890w, /wp-content/uploads/2018/05/word-image-5651-300x222.png 300w, /wp-content/uploads/2018/05/word-image-5651-768x569.png 768w" sizes="(max-width: 890px) 100vw, 890px" /></p>
<p><strong>2）开启openssl、mbstring、pdo、fileinfo扩展</strong>
</p>
<p><img loading="lazy" decoding="async" width="1022" height="405" src="/wp-content/uploads/2018/05/word-image-5652.png" class="wp-image-6208" srcset="/wp-content/uploads/2018/05/word-image-5652.png 1022w, /wp-content/uploads/2018/05/word-image-5652-300x119.png 300w, /wp-content/uploads/2018/05/word-image-5652-768x304.png 768w" sizes="(max-width: 1022px) 100vw, 1022px" /><br />
<img loading="lazy" decoding="async" width="393" height="373" src="/wp-content/uploads/2018/05/word-image-5653.png" class="wp-image-6209" srcset="/wp-content/uploads/2018/05/word-image-5653.png 393w, /wp-content/uploads/2018/05/word-image-5653-300x285.png 300w" sizes="(max-width: 393px) 100vw, 393px" /></p>
<ol>
<li><strong>修改时区</strong>
</li>
</ol>
<p><img loading="lazy" decoding="async" width="417" height="214" src="/wp-content/uploads/2018/05/word-image-5654.png" class="wp-image-6210" srcset="/wp-content/uploads/2018/05/word-image-5654.png 417w, /wp-content/uploads/2018/05/word-image-5654-300x154.png 300w" sizes="(max-width: 417px) 100vw, 417px" /></p>
<ol>
<li><strong>验证</strong>
</li>
</ol>
<p><img loading="lazy" decoding="async" width="386" height="320" src="/wp-content/uploads/2018/05/word-image-5655.png" class="wp-image-6211" srcset="/wp-content/uploads/2018/05/word-image-5655.png 386w, /wp-content/uploads/2018/05/word-image-5655-300x249.png 300w" sizes="(max-width: 386px) 100vw, 386px" /><br />
<img loading="lazy" decoding="async" width="540" height="486" src="/wp-content/uploads/2018/05/word-image-5656.png" class="wp-image-6212" srcset="/wp-content/uploads/2018/05/word-image-5656.png 540w, /wp-content/uploads/2018/05/word-image-5656-300x270.png 300w" sizes="(max-width: 540px) 100vw, 540px" /><br />
<img loading="lazy" decoding="async" width="1081" height="216" src="/wp-content/uploads/2018/05/word-image-5657.png" class="wp-image-6213" srcset="/wp-content/uploads/2018/05/word-image-5657.png 1081w, /wp-content/uploads/2018/05/word-image-5657-300x60.png 300w, /wp-content/uploads/2018/05/word-image-5657-768x153.png 768w, /wp-content/uploads/2018/05/word-image-5657-1024x205.png 1024w" sizes="(max-width: 1081px) 100vw, 1081px" /><br />
<img loading="lazy" decoding="async" width="1086" height="289" src="/wp-content/uploads/2018/05/word-image-5658.png" class="wp-image-6214" srcset="/wp-content/uploads/2018/05/word-image-5658.png 1086w, /wp-content/uploads/2018/05/word-image-5658-300x80.png 300w, /wp-content/uploads/2018/05/word-image-5658-768x204.png 768w, /wp-content/uploads/2018/05/word-image-5658-1024x273.png 1024w" sizes="(max-width: 1086px) 100vw, 1086px" /><br />
<img loading="lazy" decoding="async" width="938" height="336" src="/wp-content/uploads/2018/05/word-image-5659.png" class="wp-image-6215" srcset="/wp-content/uploads/2018/05/word-image-5659.png 938w, /wp-content/uploads/2018/05/word-image-5659-300x107.png 300w, /wp-content/uploads/2018/05/word-image-5659-768x275.png 768w" sizes="(max-width: 938px) 100vw, 938px" /></p>
<h3>d. 设置PHP环境变量</h3>
<p><img loading="lazy" decoding="async" width="260" height="362" src="/wp-content/uploads/2018/05/word-image-5660.png" class="wp-image-6216" srcset="/wp-content/uploads/2018/05/word-image-5660.png 260w, /wp-content/uploads/2018/05/word-image-5660-215x300.png 215w" sizes="(max-width: 260px) 100vw, 260px" /><br />
<img loading="lazy" decoding="async" width="1267" height="711" src="/wp-content/uploads/2018/05/word-image-5661.png" class="wp-image-6217" srcset="/wp-content/uploads/2018/05/word-image-5661.png 1267w, /wp-content/uploads/2018/05/word-image-5661-300x168.png 300w, /wp-content/uploads/2018/05/word-image-5661-768x431.png 768w, /wp-content/uploads/2018/05/word-image-5661-1024x575.png 1024w" sizes="(max-width: 1267px) 100vw, 1267px" /></p>
<p>
  验证是否设置成功
</p>
<p><img loading="lazy" decoding="async" width="500" height="185" src="/wp-content/uploads/2018/05/word-image-5662.png" class="wp-image-6218" srcset="/wp-content/uploads/2018/05/word-image-5662.png 500w, /wp-content/uploads/2018/05/word-image-5662-300x111.png 300w" sizes="(max-width: 500px) 100vw, 500px" /></p>
<h3>e. 创建虚拟主机</h3>
<ol>
<li>
  修改C:\Windows\System32\drivers\etc\hosts文件
</li>
</ol>
<p><img loading="lazy" decoding="async" width="432" height="156" src="/wp-content/uploads/2018/05/word-image-5663.png" class="wp-image-6219" srcset="/wp-content/uploads/2018/05/word-image-5663.png 432w, /wp-content/uploads/2018/05/word-image-5663-300x108.png 300w" sizes="(max-width: 432px) 100vw, 432px" /></p>
<ol>
<li>
  创建文件e:\www\test.php文件
</li>
</ol>
<p><img loading="lazy" decoding="async" width="478" height="224" src="/wp-content/uploads/2018/05/word-image-5664.png" class="wp-image-6220" srcset="/wp-content/uploads/2018/05/word-image-5664.png 478w, /wp-content/uploads/2018/05/word-image-5664-300x141.png 300w" sizes="(max-width: 478px) 100vw, 478px" /></p>
<ol>
<li>
  新增虚拟主机
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1001" height="638" src="/wp-content/uploads/2018/05/word-image-5665.png" class="wp-image-6221" srcset="/wp-content/uploads/2018/05/word-image-5665.png 1001w, /wp-content/uploads/2018/05/word-image-5665-300x191.png 300w, /wp-content/uploads/2018/05/word-image-5665-768x489.png 768w" sizes="(max-width: 1001px) 100vw, 1001px" /></p>
<p>
  发现：直接输入网址不加具体访问的php文件名则显示403 Forbidden
</p>
<p>
  解决：
</p>
<p><img loading="lazy" decoding="async" width="1173" height="421" src="/wp-content/uploads/2018/05/word-image-5666.png" class="wp-image-6222" srcset="/wp-content/uploads/2018/05/word-image-5666.png 1173w, /wp-content/uploads/2018/05/word-image-5666-300x108.png 300w, /wp-content/uploads/2018/05/word-image-5666-768x276.png 768w, /wp-content/uploads/2018/05/word-image-5666-1024x368.png 1024w" sizes="(max-width: 1173px) 100vw, 1173px" /></p>
<h2>1、安装方式</h2>
<ul>
<li>
    方法1：直接下载源代码安装
  </li>
<li>
    方法2：通过composer安装
  </li>
</ul>
<h2>2、直接下载源代码安装【方法1】</h2>
<h3>步骤1：下载</h3>
<p>
  下载地址：<a href="http://laravelacademy.org/resources-download">http://laravelacademy.org/resources-download</a>
</p>
<p><img loading="lazy" decoding="async" width="121" height="126" src="/wp-content/uploads/2018/05/word-image-5667.png" class="wp-image-6223" /></p>
<h3>步骤2：解压到指定虚拟主机目录</h3>
<p><img loading="lazy" decoding="async" width="682" height="348" src="/wp-content/uploads/2018/05/word-image-5668.png" class="wp-image-6224" srcset="/wp-content/uploads/2018/05/word-image-5668.png 682w, /wp-content/uploads/2018/05/word-image-5668-300x153.png 300w" sizes="(max-width: 682px) 100vw, 682px" /></p>
<h3>步骤3：访问（注：入口文件在public目录下）</h3>
<p><img loading="lazy" decoding="async" width="533" height="396" src="/wp-content/uploads/2018/05/word-image-5669.png" class="wp-image-6225" srcset="/wp-content/uploads/2018/05/word-image-5669.png 533w, /wp-content/uploads/2018/05/word-image-5669-300x223.png 300w" sizes="(max-width: 533px) 100vw, 533px" /></p>
<h2>3、通过Composer安装Laravel【方法2】</h2>
<h3>1）什么是Composer</h3>
<p><img loading="lazy" decoding="async" width="233" height="272" src="/wp-content/uploads/2018/05/word-image-5670.png" class="wp-image-6226" /></p>
<ul>
<li>
    介绍：是 PHP 用来管理依赖（dependency）关系的工具。你可以在自己的项目中
  </li>
</ul>
<p>
  声明所依赖的外部工具库（libraries），Composer 会帮你安装这些依赖的库文件。
</p>
<ul>
<li>
    理解：
  </li>
<li>
    如果PHP是win操作系统，composer就是杀毒软件的软件管家
  </li>
<li>
    如果PHP是Linux操作系统，composer就是yum
  </li>
</ul>
<p>
  之前：项目中需要发送邮件、验证码等功能必须自己去网上下载整合到项目中
</p>
<p>
  现在：通过composer命令安装自动整合到项目中
</p>
<ul>
<li>
    总结：
  </li>
<li>
    Composer是为PHP准备的软件管家，项目所需工具库都可以通过Composer下载
  </li>
</ul>
<h3>2）下载Composer</h3>
<ul>
<li>
    官方网站：<a href="https://getcomposer.org/">https://getcomposer.org/</a>
  </li>
<li>
    中文网站：<a href="http://www.phpcomposer.com/">http://www.phpcomposer.com/</a>
  </li>
</ul>
<p><strong>【方法1】</strong>
</p>
<ul>
<li>
    下载composer-setup.exe文件安装
  </li>
<li>
    好处：傻瓜式、安装简单
  </li>
<li>
    坏处：容易报错、仅win操作系统使用
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="568" height="380" src="/wp-content/uploads/2018/05/word-image-5671.png" class="wp-image-6227" srcset="/wp-content/uploads/2018/05/word-image-5671.png 568w, /wp-content/uploads/2018/05/word-image-5671-300x201.png 300w" sizes="(max-width: 568px) 100vw, 568px" /></p>
<p><strong>【方法2】</strong>
</p>
<ul>
<li>
    下载composer.phar文件安装
  </li>
<li>
    好处：跨平台
  </li>
<li>
    坏处：渣渣上手难
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="678" height="313" src="/wp-content/uploads/2018/05/word-image-5672.png" class="wp-image-6228" srcset="/wp-content/uploads/2018/05/word-image-5672.png 678w, /wp-content/uploads/2018/05/word-image-5672-300x138.png 300w" sizes="(max-width: 678px) 100vw, 678px" /></p>
<h3>■ 方法1：通过composer-setup.exe安装</h3>
<p><strong>步骤1：双击</strong>
</p>
<p><img loading="lazy" decoding="async" width="425" height="144" src="/wp-content/uploads/2018/05/word-image-5673.png" class="wp-image-6229" srcset="/wp-content/uploads/2018/05/word-image-5673.png 425w, /wp-content/uploads/2018/05/word-image-5673-300x102.png 300w" sizes="(max-width: 425px) 100vw, 425px" /></p>
<p><strong>步骤2：安装（注：除下图选择php.exe其余直接下一步next）:</strong>
</p>
<p><img loading="lazy" decoding="async" width="553" height="271" src="/wp-content/uploads/2018/05/word-image-5674.png" class="wp-image-6230" srcset="/wp-content/uploads/2018/05/word-image-5674.png 553w, /wp-content/uploads/2018/05/word-image-5674-300x147.png 300w" sizes="(max-width: 553px) 100vw, 553px" /></p>
<p><strong>步骤3：检查是否安装成功（在DOS窗口输入 composer出现下图字样则安装成功）</strong>
</p>
<p><img loading="lazy" decoding="async" width="647" height="318" src="/wp-content/uploads/2018/05/word-image-5675.png" class="wp-image-6231" srcset="/wp-content/uploads/2018/05/word-image-5675.png 647w, /wp-content/uploads/2018/05/word-image-5675-300x147.png 300w" sizes="(max-width: 647px) 100vw, 647px" /></p>
<h3>■ 方法2：通过composer.phar文件安装</h3>
<p><strong>步骤1：该文件免安装所以可以直接使用</strong>
</p>
<p><strong>步骤2：检查是否安装成功（在DOS窗口输入 composer出现下图字样则安装成功）</strong>
</p>
<p><img loading="lazy" decoding="async" width="806" height="318" src="/wp-content/uploads/2018/05/word-image-5676.png" class="wp-image-6232" srcset="/wp-content/uploads/2018/05/word-image-5676.png 806w, /wp-content/uploads/2018/05/word-image-5676-300x118.png 300w, /wp-content/uploads/2018/05/word-image-5676-768x303.png 768w" sizes="(max-width: 806px) 100vw, 806px" /></p>
<h3>3）Composer命令</h3>
<ul>
<li>
    复杂：php composer.phar 指令
  </li>
<li>
    简化：composer 指令
  </li>
</ul>
<p>
  说明：后期大量使用composer命令，语法：【php composer.phar 指令】
</p>
<p>
  发现：每次重复敲【php composer.phar】太长
</p>
<p>
  解决：
</p>
<ol>
<li>
  将composer.phar放到www目录中然后输入DOS命令
</li>
</ol>
<p>
  【echo @php &#8220;%~dp0composer.phar&#8221; %*&gt;composer.bat】后发现www目录下新增了.bat文件将其加入环境变量即可
</p>
<p><img loading="lazy" decoding="async" width="722" height="190" src="/wp-content/uploads/2018/05/word-image-5677.png" class="wp-image-6233" srcset="/wp-content/uploads/2018/05/word-image-5677.png 722w, /wp-content/uploads/2018/05/word-image-5677-300x79.png 300w" sizes="(max-width: 722px) 100vw, 722px" /></p>
<p>
  2）将composer.bat将去环境变量
</p>
<p><img loading="lazy" decoding="async" width="1248" height="717" src="/wp-content/uploads/2018/05/word-image-5678.png" class="wp-image-6234" srcset="/wp-content/uploads/2018/05/word-image-5678.png 1248w, /wp-content/uploads/2018/05/word-image-5678-300x172.png 300w, /wp-content/uploads/2018/05/word-image-5678-768x441.png 768w, /wp-content/uploads/2018/05/word-image-5678-1024x588.png 1024w" sizes="(max-width: 1248px) 100vw, 1248px" /></p>
<p>
  3）验证
</p>
<p><img loading="lazy" decoding="async" width="464" height="255" src="/wp-content/uploads/2018/05/word-image-5679.png" class="wp-image-6235" srcset="/wp-content/uploads/2018/05/word-image-5679.png 464w, /wp-content/uploads/2018/05/word-image-5679-300x165.png 300w" sizes="(max-width: 464px) 100vw, 464px" /></p>
<h3>安装Laravel（后天详细讲解）</h3>
<p>
  步骤1：配置通过国内镜像下载
</p>
<p>
  composer config -g repo.packagist composer <a href="https://packagist.phpcomposer.com/">https://packagist.phpcomposer.com/</a>
</p>
<p>
  步骤2：通过Composer下载框架
</p>
<p>
  composer create-project laravel/laravel test_laravel
</p>
<p><img loading="lazy" decoding="async" width="1135" height="509" src="/wp-content/uploads/2018/05/word-image-5680.png" class="wp-image-6236" srcset="/wp-content/uploads/2018/05/word-image-5680.png 1135w, /wp-content/uploads/2018/05/word-image-5680-300x135.png 300w, /wp-content/uploads/2018/05/word-image-5680-768x344.png 768w, /wp-content/uploads/2018/05/word-image-5680-1024x459.png 1024w" sizes="(max-width: 1135px) 100vw, 1135px" /><br />
<img loading="lazy" decoding="async" width="777" height="518" src="/wp-content/uploads/2018/05/word-image-5681.png" class="wp-image-6237" srcset="/wp-content/uploads/2018/05/word-image-5681.png 777w, /wp-content/uploads/2018/05/word-image-5681-300x200.png 300w, /wp-content/uploads/2018/05/word-image-5681-768x512.png 768w" sizes="(max-width: 777px) 100vw, 777px" /></p>
<h1>三、Laravel目录结构分析</h1>
<h2>1、整体目录</h2>
<p><img loading="lazy" decoding="async" width="440" height="606" src="/wp-content/uploads/2018/05/word-image-5682.png" class="wp-image-6238" srcset="/wp-content/uploads/2018/05/word-image-5682.png 440w, /wp-content/uploads/2018/05/word-image-5682-218x300.png 218w" sizes="(max-width: 440px) 100vw, 440px" /></p>
<h2>2、app目录</h2>
<p><img loading="lazy" decoding="async" width="451" height="265" src="/wp-content/uploads/2018/05/word-image-5683.png" class="wp-image-6239" srcset="/wp-content/uploads/2018/05/word-image-5683.png 451w, /wp-content/uploads/2018/05/word-image-5683-300x176.png 300w" sizes="(max-width: 451px) 100vw, 451px" /></p>
<h2>3、Http目录</h2>
<p><img loading="lazy" decoding="async" width="551" height="493" src="/wp-content/uploads/2018/05/word-image-5684.png" class="wp-image-6240" srcset="/wp-content/uploads/2018/05/word-image-5684.png 551w, /wp-content/uploads/2018/05/word-image-5684-300x268.png 300w" sizes="(max-width: 551px) 100vw, 551px" /></p>
<h2>4、boostrap目录</h2>
<p><img loading="lazy" decoding="async" width="1004" height="489" src="/wp-content/uploads/2018/05/word-image-5685.png" class="wp-image-6241" srcset="/wp-content/uploads/2018/05/word-image-5685.png 1004w, /wp-content/uploads/2018/05/word-image-5685-300x146.png 300w, /wp-content/uploads/2018/05/word-image-5685-768x374.png 768w" sizes="(max-width: 1004px) 100vw, 1004px" /></p>
<h2>5、config目录</h2>
<p><img loading="lazy" decoding="async" width="432" height="452" src="/wp-content/uploads/2018/05/word-image-5686.png" class="wp-image-6242" srcset="/wp-content/uploads/2018/05/word-image-5686.png 432w, /wp-content/uploads/2018/05/word-image-5686-287x300.png 287w" sizes="(max-width: 432px) 100vw, 432px" /></p>
<h2>6、database目录</h2>
<p><img loading="lazy" decoding="async" width="403" height="276" src="/wp-content/uploads/2018/05/word-image-5687.png" class="wp-image-6243" srcset="/wp-content/uploads/2018/05/word-image-5687.png 403w, /wp-content/uploads/2018/05/word-image-5687-300x205.png 300w, /wp-content/uploads/2018/05/word-image-5687-220x150.png 220w" sizes="(max-width: 403px) 100vw, 403px" /></p>
<h2>7、public目录</h2>
<p><img loading="lazy" decoding="async" width="438" height="469" src="/wp-content/uploads/2018/05/word-image-5688.png" class="wp-image-6244" srcset="/wp-content/uploads/2018/05/word-image-5688.png 438w, /wp-content/uploads/2018/05/word-image-5688-280x300.png 280w" sizes="(max-width: 438px) 100vw, 438px" /></p>
<p>
  为什么public下比tp32安全
</p>
<p>
  为什么tp32每个目录下都要新建index.html文件
</p>
<h2>8、resource目录</h2>
<p><img loading="lazy" decoding="async" width="496" height="498" src="/wp-content/uploads/2018/05/word-image-5689.png" class="wp-image-6245" srcset="/wp-content/uploads/2018/05/word-image-5689.png 496w, /wp-content/uploads/2018/05/word-image-5689-150x150.png 150w, /wp-content/uploads/2018/05/word-image-5689-300x300.png 300w" sizes="(max-width: 496px) 100vw, 496px" /></p>
<h2>9、storage目录</h2>
<p><img loading="lazy" decoding="async" width="484" height="315" src="/wp-content/uploads/2018/05/word-image-5690.png" class="wp-image-6246" srcset="/wp-content/uploads/2018/05/word-image-5690.png 484w, /wp-content/uploads/2018/05/word-image-5690-300x195.png 300w" sizes="(max-width: 484px) 100vw, 484px" /></p>
<h2>10、vendor目录</h2>
<p><img loading="lazy" decoding="async" width="518" height="510" src="/wp-content/uploads/2018/05/word-image-5691.png" class="wp-image-6247" srcset="/wp-content/uploads/2018/05/word-image-5691.png 518w, /wp-content/uploads/2018/05/word-image-5691-300x295.png 300w" sizes="(max-width: 518px) 100vw, 518px" /></p>
<h2>11、.env文件</h2>
<p><img loading="lazy" decoding="async" width="992" height="643" src="/wp-content/uploads/2018/05/word-image-5692.png" class="wp-image-6248" srcset="/wp-content/uploads/2018/05/word-image-5692.png 992w, /wp-content/uploads/2018/05/word-image-5692-300x194.png 300w, /wp-content/uploads/2018/05/word-image-5692-768x498.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<h1>︴思考：通过框架完成下属功能需要哪些知识点？</h1>
<h2>1、留言列表显示</h2>
<p><img loading="lazy" decoding="async" width="397" height="436" src="/wp-content/uploads/2018/05/word-image-5693.png" class="wp-image-6249" srcset="/wp-content/uploads/2018/05/word-image-5693.png 397w, /wp-content/uploads/2018/05/word-image-5693-273x300.png 273w" sizes="(max-width: 397px) 100vw, 397px" /></p>
<p>
  【展示视图】
</p>
<p>
  如何创建路由
</p>
<p>
  如何创建控制器
</p>
<p>
  如何创建视图
</p>
<p>
  【循环显示数据】
</p>
<p>
  控制器如何操作数据库
</p>
<p>
  视图如何循环
</p>
<h2>添加留言</h2>
<p><img loading="lazy" decoding="async" width="386" height="315" src="/wp-content/uploads/2018/05/word-image-5694.png" class="wp-image-6250" srcset="/wp-content/uploads/2018/05/word-image-5694.png 386w, /wp-content/uploads/2018/05/word-image-5694-300x245.png 300w" sizes="(max-width: 386px) 100vw, 386px" /></p>
<p>
  【页面显示】如何创建路由 -&gt; 如何创建控制器 -&gt; 如何创建添加表单视图
</p>
<p>
  【数据处理】如何接口提交的数据，如何保存到数据库
</p>
<h2>总结（新框架快速上手原则）</h2>
<p>
  如何创建路由
</p>
<p>
  如何创建控制器
</p>
<p>
  如何创建视图
</p>
<h1>四、Laravel框架中的控制器</h1>
<h2>1、控制器的存放目录</h2>
<p>
  app\Http\Controllers\平台名\控制器名Controller.php
</p>
<h2>控制器的命名规则</h2>
<p>
  规    则：大驼峰命名法（单词首字母大写）
</p>
<p>
  举个栗子：UserController.php 或 GoodsController.php
</p>
<h2>3、创建控制器</h2>
<h3>方法1：artisan命令创建 （使用代码生成器创建控制器）</h3>
<p>
  命令：php artisan make:controller 平台名\控制器名Controller
</p>
<p>
  说明：必须在项目根目录下执行，因为artisan在根目录下
</p>
<p><img loading="lazy" decoding="async" width="1129" height="659" src="/wp-content/uploads/2018/05/word-image-5695.png" class="wp-image-6251" srcset="/wp-content/uploads/2018/05/word-image-5695.png 1129w, /wp-content/uploads/2018/05/word-image-5695-300x175.png 300w, /wp-content/uploads/2018/05/word-image-5695-768x448.png 768w, /wp-content/uploads/2018/05/word-image-5695-1024x598.png 1024w" sizes="(max-width: 1129px) 100vw, 1129px" /></p>
<h3>方法2：手动创建</h3>
<p>
  直接复制已经创建的控制器即可
</p>
<p><img loading="lazy" decoding="async" width="875" height="378" src="/wp-content/uploads/2018/05/word-image-5696.png" class="wp-image-6252" srcset="/wp-content/uploads/2018/05/word-image-5696.png 875w, /wp-content/uploads/2018/05/word-image-5696-300x130.png 300w, /wp-content/uploads/2018/05/word-image-5696-768x332.png 768w" sizes="(max-width: 875px) 100vw, 875px" /></p>
<h1>路由1</h1>
<h2>准备：PHP闭包</h2>
<h3>1）JS闭包</h3>
<ul>
<li>
    概念：在JS中当一个函数执行时可以让其内部局部变量不受其他作用域影响，同
  </li>
</ul>
<p>
  时当前函数执行完毕后还可能让其内部变量常驻内存不销毁的运行机制被称为JavaScript的闭包。
</p>
<ul>
<li>
    定义：两个函数彼此嵌套，并返回内部函数
  </li>
</ul>
<p>
  function f1() {
</p>
<p>
  function f2() {
</p>
<p>
  }
</p>
<p>
  return f2;
</p>
<p>
  }
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  var arr = new Array();
</p>
<p>
  for (var i = 1; i &lt; 3; i++) {
</p>
</p>
<p>
  	//arr[i] = function(i) {
</p>
<p>
  	//	alert(i);
</p>
<p>
  	//}
</p>
<p>
  	arr[i] = f1(i);
</p>
<p>
  }
</p>
<p>
  function f1(num) {
</p>
<p>
  	function f2() {
</p>
<p>
  		alert(num);
</p>
<p>
  	}
</p>
<p>
  	return f2;
</p>
<p>
  }
</p>
<h3>PHP闭包函数（php5.3+）</h3>
<p><img loading="lazy" decoding="async" width="747" height="175" src="/wp-content/uploads/2018/05/word-image-5697.png" class="wp-image-6253" srcset="/wp-content/uploads/2018/05/word-image-5697.png 747w, /wp-content/uploads/2018/05/word-image-5697-300x70.png 300w" sizes="(max-width: 747px) 100vw, 747px" /><br />
<img loading="lazy" decoding="async" width="958" height="471" src="/wp-content/uploads/2018/05/word-image-5698.png" class="wp-image-6254" srcset="/wp-content/uploads/2018/05/word-image-5698.png 958w, /wp-content/uploads/2018/05/word-image-5698-300x147.png 300w, /wp-content/uploads/2018/05/word-image-5698-768x378.png 768w" sizes="(max-width: 958px) 100vw, 958px" /></p>
<h2>1、路由的作用</h2>
<ul>
<li>
    概念：路由就是网址的参数
  </li>
<li>
    作用：将用户发送的HTTP请求，交给指定的控制器方法处理
  </li>
</ul>
<h2>2、路由配置文件</h2>
<p><img loading="lazy" decoding="async" width="886" height="387" src="/wp-content/uploads/2018/05/word-image-5699.png" class="wp-image-6255" srcset="/wp-content/uploads/2018/05/word-image-5699.png 886w, /wp-content/uploads/2018/05/word-image-5699-300x131.png 300w, /wp-content/uploads/2018/05/word-image-5699-768x335.png 768w" sizes="(max-width: 886px) 100vw, 886px" /></p>
<h2><a id="post-6202-_Toc487903151"></a>3、配置路由（routes\web.php）</h2>
<h3><a id="post-6202-_Toc487903152"></a>1、路由定义格式（语法）</h3>
<p>
  Route::HTTP请求方法（路径，闭包函数或者控制器方法）
</p>
<p>
  响应多个HTTP请求
</p>
<p>
  Route::match（[请求类型，请求类型&#8230;.], 路径，闭包函数或者控制器方法）
</p>
<p>
  响应任意HTTP请求
</p>
<p>
  Route::any（路径，闭包函数或者控制器方法）
</p>
<h3><a id="post-6202-_Toc487903153"></a>2、请求方式有哪些？</h3>
<p>
  可以是HTTP的8种请求类型之一，如：get、put、post、delete&#8230;等，常用get和post
</p>
<h3>︴练习</h3>
<ul>
<li>
    不同的请求响应
  </li>
<li>
    get请求，闭包函数响应
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1212" height="610" src="/wp-content/uploads/2018/05/word-image-5700.png" class="wp-image-6256" srcset="/wp-content/uploads/2018/05/word-image-5700.png 1212w, /wp-content/uploads/2018/05/word-image-5700-300x151.png 300w, /wp-content/uploads/2018/05/word-image-5700-768x387.png 768w, /wp-content/uploads/2018/05/word-image-5700-1024x515.png 1024w" sizes="(max-width: 1212px) 100vw, 1212px" /></p>
<ul>
<li>
    get请求，控制器响应
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1335" height="635" src="/wp-content/uploads/2018/05/word-image-5701.png" class="wp-image-6257" srcset="/wp-content/uploads/2018/05/word-image-5701.png 1335w, /wp-content/uploads/2018/05/word-image-5701-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5701-768x365.png 768w, /wp-content/uploads/2018/05/word-image-5701-1024x487.png 1024w" sizes="(max-width: 1335px) 100vw, 1335px" /></p>
<ul>
<li>
    post请求，闭包函数响应（注：app\Http\Kernel.php注释VerifyCsrfToken）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1087" height="672" src="/wp-content/uploads/2018/05/word-image-5702.png" class="wp-image-6258" srcset="/wp-content/uploads/2018/05/word-image-5702.png 1087w, /wp-content/uploads/2018/05/word-image-5702-300x185.png 300w, /wp-content/uploads/2018/05/word-image-5702-768x475.png 768w, /wp-content/uploads/2018/05/word-image-5702-1024x633.png 1024w" sizes="(max-width: 1087px) 100vw, 1087px" /><br />
<img loading="lazy" decoding="async" width="1251" height="510" src="/wp-content/uploads/2018/05/word-image-5703.png" class="wp-image-6259" srcset="/wp-content/uploads/2018/05/word-image-5703.png 1251w, /wp-content/uploads/2018/05/word-image-5703-300x122.png 300w, /wp-content/uploads/2018/05/word-image-5703-768x313.png 768w, /wp-content/uploads/2018/05/word-image-5703-1024x417.png 1024w" sizes="(max-width: 1251px) 100vw, 1251px" /></p>
<ul>
<li>
    post请求，控制器响应
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1334" height="659" src="/wp-content/uploads/2018/05/word-image-5704.png" class="wp-image-6260" srcset="/wp-content/uploads/2018/05/word-image-5704.png 1334w, /wp-content/uploads/2018/05/word-image-5704-300x148.png 300w, /wp-content/uploads/2018/05/word-image-5704-768x379.png 768w, /wp-content/uploads/2018/05/word-image-5704-1024x506.png 1024w" sizes="(max-width: 1334px) 100vw, 1334px" /></p>
<ul>
<li>
    响应<strong>多个</strong>HTTP请求
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="622" height="159" src="/wp-content/uploads/2018/05/word-image-5705.png" class="wp-image-6261" srcset="/wp-content/uploads/2018/05/word-image-5705.png 622w, /wp-content/uploads/2018/05/word-image-5705-300x77.png 300w" sizes="(max-width: 622px) 100vw, 622px" /></p>
<ul>
<li>
    响应<strong>所有</strong>HTTP请求
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="477" height="176" src="/wp-content/uploads/2018/05/word-image-5706.png" class="wp-image-6262" srcset="/wp-content/uploads/2018/05/word-image-5706.png 477w, /wp-content/uploads/2018/05/word-image-5706-300x111.png 300w" sizes="(max-width: 477px) 100vw, 477px" /></p>
<h2>4、路由参数</h2>
<h3>1）语法</h3>
<p>
  Route::HTTP请求方式（路径/{参数}，闭包函数或控制器方法名）-&gt;where（参数名,正则表达式）
</p>
<p>
  多个参数： 路径/{参数}/{参数}   或者   路径/{参数}-{参数}/{参数}
</p>
<p>
  多个限制：-&gt;where（[参数=&gt;正则，&#8230;，参数n-&gt;正则n]）
</p>
<p>
  多学一招：{参数名？} 表示可以设置默认值
</p>
<h3>2）闭包函数操作参数</h3>
<ul>
<li>
    一个参数
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="663" height="213" src="/wp-content/uploads/2018/05/word-image-5707.png" class="wp-image-6263" srcset="/wp-content/uploads/2018/05/word-image-5707.png 663w, /wp-content/uploads/2018/05/word-image-5707-300x96.png 300w" sizes="(max-width: 663px) 100vw, 663px" /></p>
<p>
  #一个参数
</p>
<p>
  Route::get(&#8216;/test7/{id}&#8217;, function($id){
</p>
<p>
      echo $id;
</p>
<p>
  });
</p>
<ul>
<li>
    多个参数
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="793" height="236" src="/wp-content/uploads/2018/05/word-image-5708.png" class="wp-image-6264" srcset="/wp-content/uploads/2018/05/word-image-5708.png 793w, /wp-content/uploads/2018/05/word-image-5708-300x89.png 300w, /wp-content/uploads/2018/05/word-image-5708-768x229.png 768w" sizes="(max-width: 793px) 100vw, 793px" /></p>
<p>
  #多个参数
</p>
<p>
  Route::get(&#8216;/test7/{id}/{name}&#8217;, function($id, $name){
</p>
<p>
      echo $id . &#8216;__&#8217; . $name;
</p>
<p>
  });
</p>
<ul>
<li>
    默认参数
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="802" height="332" src="/wp-content/uploads/2018/05/word-image-5709.png" class="wp-image-6265" srcset="/wp-content/uploads/2018/05/word-image-5709.png 802w, /wp-content/uploads/2018/05/word-image-5709-300x124.png 300w, /wp-content/uploads/2018/05/word-image-5709-768x318.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></p>
<h3>3）控制器操作参数</h3>
<p><img loading="lazy" decoding="async" width="814" height="541" src="/wp-content/uploads/2018/05/word-image-5710.png" class="wp-image-6266" srcset="/wp-content/uploads/2018/05/word-image-5710.png 814w, /wp-content/uploads/2018/05/word-image-5710-300x199.png 300w, /wp-content/uploads/2018/05/word-image-5710-768x510.png 768w" sizes="(max-width: 814px) 100vw, 814px" /><br />
<img loading="lazy" decoding="async" width="1120" height="527" src="/wp-content/uploads/2018/05/word-image-5711.png" class="wp-image-6267" srcset="/wp-content/uploads/2018/05/word-image-5711.png 1120w, /wp-content/uploads/2018/05/word-image-5711-300x141.png 300w, /wp-content/uploads/2018/05/word-image-5711-768x361.png 768w, /wp-content/uploads/2018/05/word-image-5711-1024x482.png 1024w" sizes="(max-width: 1120px) 100vw, 1120px" /></p>
<h3>4）正则表达式限制参数</h3>
<ul>
<li>
    限制一个参数
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="544" height="152" src="/wp-content/uploads/2018/05/word-image-5712.png" class="wp-image-6268" srcset="/wp-content/uploads/2018/05/word-image-5712.png 544w, /wp-content/uploads/2018/05/word-image-5712-300x84.png 300w" sizes="(max-width: 544px) 100vw, 544px" /></p>
<ul>
<li>
    限制多个参数
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="751" height="252" src="/wp-content/uploads/2018/05/word-image-5713.png" class="wp-image-6269" srcset="/wp-content/uploads/2018/05/word-image-5713.png 751w, /wp-content/uploads/2018/05/word-image-5713-300x101.png 300w" sizes="(max-width: 751px) 100vw, 751px" /></p>
<h2>5、路由群组</h2>
<h3>1）概念</h3>
<p>
  多个路由之间共享路由属性，减少冗余。
</p>
<h3>语法</h3>
<p>
  Route::group（[属性名=&gt;属性值n,&#8230;,属性名=&gt;属性值n]，function（）{
</p>
<p>
       将其他路由放进来即可&#8230;.
</p>
<p>
  }）
</p>
<h3>3）案例</h3>
<p><img loading="lazy" decoding="async" width="1154" height="640" src="/wp-content/uploads/2018/05/word-image-5714.png" class="wp-image-6270" srcset="/wp-content/uploads/2018/05/word-image-5714.png 1154w, /wp-content/uploads/2018/05/word-image-5714-300x166.png 300w, /wp-content/uploads/2018/05/word-image-5714-768x426.png 768w, /wp-content/uploads/2018/05/word-image-5714-1024x568.png 1024w" sizes="(max-width: 1154px) 100vw, 1154px" /></p>
<p>
  #路由群组举个栗子（需求：完成用户增删改查）
</p>
<p>
  Route::group([&#8216;namespace&#8217;=&gt;&#8217;Admin&#8217;, &#8216;prefix&#8217; =&gt; &#8216;/user&#8217;], function(){
</p>
<p>
      #Route::get(&#8216;/user/index&#8217;, &#8216;Admin\UserController@index&#8217;);
</p>
<p>
      #Route::get(&#8216;/user/create&#8217;, &#8216;Admin\UserController@create&#8217;);
</p>
<p>
      #Route::get(&#8216;/user/delete/{id}&#8217;, &#8216;Admin\UserController@delete&#8217;);
</p>
<p>
      #Route::get(&#8216;/user/update&#8217;, &#8216;Admin\UserController@update&#8217;);
</p>
<p>
      Route::get(&#8216;index&#8217;, &#8216;UserController@index&#8217;);
</p>
<p>
      Route::get(&#8216;create&#8217;, &#8216;UserController@create&#8217;);
</p>
<p>
      Route::get(&#8216;delete/{id}&#8217;, &#8216;UserController@delete&#8217;);
</p>
<p>
      Route::get(&#8216;update&#8217;, &#8216;UserController@update&#8217;);
</p>
<p>
  });
</p>
<h2>6、路由别名</h2>
<p><img loading="lazy" decoding="async" width="863" height="621" src="/wp-content/uploads/2018/05/word-image-5715.png" class="wp-image-6271" srcset="/wp-content/uploads/2018/05/word-image-5715.png 863w, /wp-content/uploads/2018/05/word-image-5715-300x216.png 300w, /wp-content/uploads/2018/05/word-image-5715-768x553.png 768w" sizes="(max-width: 863px) 100vw, 863px" /></p>
<p>
  #路由别名：同MySQL需要别名因为名字太长或者不好记等情况
</p>
<p>
  //Route::get(&#8216;/jintainwofeichangkaixinsdfadsf&#8217;, function() {
</p>
<p>
  //    echo &#8216;test11&#8217;;
</p>
<p>
  //});
</p>
<p>
  Route::get(&#8216;/jintainwofeichangkaixinsdfadsf&#8217;, [
</p>
<p>
      &#8216;as&#8217; =&gt; &#8216;bieming&#8217;,
</p>
<p>
      &#8216;uses&#8217; =&gt; function() {
</p>
<p>
          echo &#8216;我们都不容易&#8217;;
</p>
<p>
      }
</p>
<p>
  ]);
</p>
<p>
  Route::get(&#8216;/test11&#8217;, function() {
</p>
<p>
  //    {{ U（&#8217;user/index&#8217;） }}
</p>
<p>
  //    {{ url(‘/jintainwofeichangkaixinsdfadsf’) }}
</p>
<p>
      echo route(&#8216;bieming&#8217;); //通过路由别名替换url方法，放到表单action属性中
</p>
<p>
  });
</p>
<h2>小总结</h2>
<ul>
<li>
    什么是路由：就是网址
  </li>
<li>
    路由作用：将用户的请求交给指定的控制器方法处理
  </li>
<li>
    路由在哪：routes\web.php
  </li>
<li>
    路由语法
  </li>
<li>
    基        本：Route::HTTP类型（路径，闭包函数或控制器方法）
  </li>
<li>
    响应指定请求：Route::match（[类型，..，类型]，路径，闭包函数或控制器方法）
  </li>
<li>
    响应多有请求：Route::any（路径，闭包函数或控制器方法）
  </li>
<li>
    路由参数语法
  </li>
<li>
    Route::HTTP类型（路径/{参数}，闭包函数或控制器方法）-&gt;where（参数，正则）
  </li>
</ul>
<p>
  多个参数：就是写多个{}
</p>
<p>
  多个限制：则where使用数组 [参数=&gt;正则, &#8230;, 参数n=&gt;正则n]
</p>
<ul>
<li>
    路由群组
  </li>
<li>
    概念：就是给多个路由设置相同的属性，减少冗余
  </li>
<li>
    语法
  </li>
</ul>
<p>
  Route::group（[&#8216;namespace&#8217; =&gt; &#8221;, &#8216;preifx&#8217;=&gt;&#8221;]， function（）{
</p>
<p>
       写其他路由&#8230;
</p>
<p>
  }）
</p>
<ul>
<li>
    路由别名
  </li>
<li>
    概念：就是路由名称太长，则写个别名，后期可以通过方法route获取别名的真实
  </li>
</ul>
<p>
  路由地址
</p>
<ul>
<li>
    语法
  </li>
</ul>
<p>
  Route::请求类型（路径，[
</p>
<p>
      ‘as’ =&gt; 别名,
</p>
<p>
      ‘uses’ =&gt;  闭包函数 或者 控制器方法
</p>
<p>
  ]）
</p>
<h1>视图1</h1>
<h2>控制器调用视图</h2>
<h3>1）语法</h3>
<ul>
<li>
    方法1：return‘字符串’
  </li>
<li>
    方法2：return view（视图文件，compact（变量名，&#8230;，变量名n））；
  </li>
</ul>
<p>
  return view加载视图会去resources/views下面找（ps. view所有名称统一小写）
</p>
<p>
  return view（&#8217;php12&#8217;）会优先找blade模板引擎
</p>
<p>
  如果需要调用resources/views/子目录中的文件则用“.”拼接
</p>
<h3>2）练习（调用视图）</h3>
<p>
  步骤1：
</p>
<p><img loading="lazy" decoding="async" width="1045" height="409" src="/wp-content/uploads/2018/05/word-image-5716.png" class="wp-image-6272" srcset="/wp-content/uploads/2018/05/word-image-5716.png 1045w, /wp-content/uploads/2018/05/word-image-5716-300x117.png 300w, /wp-content/uploads/2018/05/word-image-5716-768x301.png 768w, /wp-content/uploads/2018/05/word-image-5716-1024x401.png 1024w" sizes="(max-width: 1045px) 100vw, 1045px" /></p>
<p>
  步骤2：
</p>
<p><img loading="lazy" decoding="async" width="1048" height="656" src="/wp-content/uploads/2018/05/word-image-5717.png" class="wp-image-6273" srcset="/wp-content/uploads/2018/05/word-image-5717.png 1048w, /wp-content/uploads/2018/05/word-image-5717-300x188.png 300w, /wp-content/uploads/2018/05/word-image-5717-768x481.png 768w, /wp-content/uploads/2018/05/word-image-5717-1024x641.png 1024w" sizes="(max-width: 1048px) 100vw, 1048px" /><br />
<img loading="lazy" decoding="async" width="1255" height="534" src="/wp-content/uploads/2018/05/word-image-5718.png" class="wp-image-6274" srcset="/wp-content/uploads/2018/05/word-image-5718.png 1255w, /wp-content/uploads/2018/05/word-image-5718-300x128.png 300w, /wp-content/uploads/2018/05/word-image-5718-768x327.png 768w, /wp-content/uploads/2018/05/word-image-5718-1024x436.png 1024w" sizes="(max-width: 1255px) 100vw, 1255px" /></p>
<h2><a id="post-6202-_Toc487903182"></a>基本用法视图传参</h2>
<h3>认识compact函数</h3>
<ul>
<li>
    语法：compact（变量名，&#8230;.，变量名n）
  </li>
<li>
    作用：将多个变量组成数组
  </li>
<li>
    代码：
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="785" height="420" src="/wp-content/uploads/2018/05/word-image-5719.png" class="wp-image-6275" srcset="/wp-content/uploads/2018/05/word-image-5719.png 785w, /wp-content/uploads/2018/05/word-image-5719-300x161.png 300w, /wp-content/uploads/2018/05/word-image-5719-768x411.png 768w" sizes="(max-width: 785px) 100vw, 785px" /></p>
<p>
  &lt;?php
</p>
<p>
  $a = &#8216;h1&#8217;;
</p>
<p>
  $b = &#8216;h2&#8217;;
</p>
<p>
  $c = &#8216;hd&#8217;;
</p>
<p>
  $data = compact(&#8216;a&#8217;,&#8217;b&#8217;,&#8217;fasdfasd&#8217;);
</p>
<p>
  echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  print_r($data);
</p>
<h3>2）数组方式</h3>
<p><img loading="lazy" decoding="async" width="1316" height="707" src="/wp-content/uploads/2018/05/word-image-5720.png" class="wp-image-6276" srcset="/wp-content/uploads/2018/05/word-image-5720.png 1316w, /wp-content/uploads/2018/05/word-image-5720-300x161.png 300w, /wp-content/uploads/2018/05/word-image-5720-768x413.png 768w, /wp-content/uploads/2018/05/word-image-5720-1024x550.png 1024w" sizes="(max-width: 1316px) 100vw, 1316px" /></p>
<h3>3）工作常用</h3>
<p><img loading="lazy" decoding="async" width="1306" height="712" src="/wp-content/uploads/2018/05/word-image-5721.png" class="wp-image-6277" srcset="/wp-content/uploads/2018/05/word-image-5721.png 1306w, /wp-content/uploads/2018/05/word-image-5721-300x164.png 300w, /wp-content/uploads/2018/05/word-image-5721-768x419.png 768w, /wp-content/uploads/2018/05/word-image-5721-1024x558.png 1024w" sizes="(max-width: 1306px) 100vw, 1306px" /></p>
<h2><a id="post-6202-_Toc487903184"></a>4、【★】blade模板</h2>
<h3>1）什么是blade模板</h3>
<ul>
<li>
    blade模板同smarty模板一样都是PHP模板引擎
  </li>
<li>
    blade模板是laravel自带模板引擎（推荐使用也可以使用原声php）
  </li>
</ul>
<p>
  问：什么是模板引擎
</p>
<p>
  答：就是用PHP写的一个类
</p>
<p>
  问：是个类就是模板引擎吗
</p>
<p>
  答：非也，具备将php代码和html代码分离类称之为模板引擎
</p>
<h3>2）blade模板标签</h3>
<ul>
<li>
    注释（同Smarty注释响应时不含注释内容）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="992" height="506" src="/wp-content/uploads/2018/05/word-image-5722.png" class="wp-image-6278" srcset="/wp-content/uploads/2018/05/word-image-5722.png 992w, /wp-content/uploads/2018/05/word-image-5722-300x153.png 300w, /wp-content/uploads/2018/05/word-image-5722-768x392.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<ul>
<li>
    展示变量数据
  </li>
</ul>
<p>
  {{ $变量名 }}
</p>
<p><img loading="lazy" decoding="async" width="717" height="447" src="/wp-content/uploads/2018/05/word-image-5723.png" class="wp-image-6279" srcset="/wp-content/uploads/2018/05/word-image-5723.png 717w, /wp-content/uploads/2018/05/word-image-5723-300x187.png 300w" sizes="(max-width: 717px) 100vw, 717px" /></p>
<ul>
<li>
    循环
  </li>
</ul>
<p>
  @foreach（变量名 as  键=&gt;值）
</p>
<p>
  @endforeach
</p>
<p><img loading="lazy" decoding="async" width="701" height="427" src="/wp-content/uploads/2018/05/word-image-5724.png" class="wp-image-6280" srcset="/wp-content/uploads/2018/05/word-image-5724.png 701w, /wp-content/uploads/2018/05/word-image-5724-300x183.png 300w" sizes="(max-width: 701px) 100vw, 701px" /></p>
<ul>
<li>
    判断
  </li>
</ul>
<p>
  @if ()
</p>
<p>
  @else if ()
</p>
<p>
  @else
</p>
<p>
  @endif
</p>
<p><img loading="lazy" decoding="async" width="665" height="510" src="/wp-content/uploads/2018/05/word-image-5725.png" class="wp-image-6281" srcset="/wp-content/uploads/2018/05/word-image-5725.png 665w, /wp-content/uploads/2018/05/word-image-5725-300x230.png 300w" sizes="(max-width: 665px) 100vw, 665px" /></p>
<ul>
<li>
    指定原声PHP（少用）
  </li>
</ul>
<p>
  @php
</p>
<p>
  @endphp
</p>
<p><img loading="lazy" decoding="async" width="720" height="444" src="/wp-content/uploads/2018/05/word-image-5726.png" class="wp-image-6282" srcset="/wp-content/uploads/2018/05/word-image-5726.png 720w, /wp-content/uploads/2018/05/word-image-5726-300x185.png 300w" sizes="(max-width: 720px) 100vw, 720px" /></p>
<h1>获取请求输入</h1>
<h2>1、语法</h2>
<h3>1）方法1</h3>
<ul>
<li>
    步骤1：导入类【use Illuminate\Http\Request;】
  </li>
<li>
    步骤2：在控制器方法中声明使用，如
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="470" height="65" src="/wp-content/uploads/2018/05/word-image-5727.png" class="wp-image-6283" srcset="/wp-content/uploads/2018/05/word-image-5727.png 470w, /wp-content/uploads/2018/05/word-image-5727-300x41.png 300w" sizes="(max-width: 470px) 100vw, 470px" /></p>
<ul>
<li>
    步骤3：最后使用下属语法获取数据
  </li>
<li>
    $request-&gt;all（）										获取所有数据
  </li>
<li>
    $request-&gt;input（键 [,默认值]）					获取GET数据
  </li>
<li>
    $request-&gt;only（[参数名1，&#8230;，参数名n]）    获取指定数据
  </li>
<li>
    $request-&gt;except（[参数名1，&#8230;，参数名n]）   获取指定数据外的所有数据
  </li>
<li>
    查看更多：<a href="http://laravelacademy.org/post/6750.html#toc_4">http://laravelacademy.org/post/6750.html#toc_4</a>
  </li>
</ul>
<h3>方法2</h3>
<ul>
<li>
    步骤1：导入类【Illuminate\Support\Facades\Input;】
  </li>
<li>
    步骤2：最后使用下属语法获取数据
  </li>
<li>
    Input::all（）										获取所有数据
  </li>
<li>
    Input::get（参数名[，默认值]）  				获取单个数据
  </li>
<li>
    Input::only（[键1，&#8230;，键n]）   				获取指定数据
  </li>
<li>
    Input::except（[键1，&#8230;，键n]） 				获取指定数据外的所有数据
  </li>
</ul>
<h2>2、练习</h2>
<p>
  步骤1：定义路由
</p>
<p><img loading="lazy" decoding="async" width="1156" height="361" src="/wp-content/uploads/2018/05/word-image-5728.png" class="wp-image-6284" srcset="/wp-content/uploads/2018/05/word-image-5728.png 1156w, /wp-content/uploads/2018/05/word-image-5728-300x94.png 300w, /wp-content/uploads/2018/05/word-image-5728-768x240.png 768w, /wp-content/uploads/2018/05/word-image-5728-1024x320.png 1024w" sizes="(max-width: 1156px) 100vw, 1156px" /></p>
<p>
  步骤2：创建控制器方法
</p>
<p><img loading="lazy" decoding="async" width="1319" height="536" src="/wp-content/uploads/2018/05/word-image-5729.png" class="wp-image-6285" srcset="/wp-content/uploads/2018/05/word-image-5729.png 1319w, /wp-content/uploads/2018/05/word-image-5729-300x122.png 300w, /wp-content/uploads/2018/05/word-image-5729-768x312.png 768w, /wp-content/uploads/2018/05/word-image-5729-1024x416.png 1024w" sizes="(max-width: 1319px) 100vw, 1319px" /></p>
<p>
  步骤3:创建视图
</p>
<p><img loading="lazy" decoding="async" width="1196" height="617" src="/wp-content/uploads/2018/05/word-image-5730.png" class="wp-image-6286" srcset="/wp-content/uploads/2018/05/word-image-5730.png 1196w, /wp-content/uploads/2018/05/word-image-5730-300x155.png 300w, /wp-content/uploads/2018/05/word-image-5730-768x396.png 768w, /wp-content/uploads/2018/05/word-image-5730-1024x528.png 1024w" sizes="(max-width: 1196px) 100vw, 1196px" /></p>
<h1>八、留言板功能</h1>
<h2>︴准备（数据库初体验，明天详细讲）</h2>
<ul>
<li>
    语法
  </li>
</ul>
<p>
  查询所有数据语法：DB::table（表名）-&gt;get（）
</p>
<p>
  插入数据语法：DB::table（表名）-&gt;insert（关联数组）
</p>
<ul>
<li>
    练习
  </li>
</ul>
<p>
  步骤1：创建数据库和留言表并插入数据
</p>
<p>
  create database laravel54;
</p>
<p>
  use laravel54;
</p>
<p>
  #标准写法
</p>
<p>
  &#8212; create table msg (
</p>
<p>
  &#8212; id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  &#8212; uname varchar(45) not null comment &#8216;用户名&#8217;,
</p>
<p>
  &#8212; content text not null comment &#8216;内容&#8217;,
</p>
<p>
  &#8212; created_at int not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  &#8212; updated_at int not null default 0 comment &#8216;更新于&#8217;
</p>
<p>
  &#8212; )engine=myisam charset=utf8;
</p>
<p>
  #为铺垫后面课程修改
</p>
<p>
  create table msg (
</p>
<p>
  id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  uname varchar(45) comment &#8216;用户名&#8217;,
</p>
<p>
  content text comment &#8216;内容&#8217;,
</p>
<p>
  created_at int not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  updated_at int not null default 0 comment &#8216;更新于&#8217;
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<p>
  insert into msg values
</p>
<p>
  (null,&#8217;a&#8217;,&#8217;aaaa&#8217;,0,0),
</p>
<p>
  (null,&#8217;a&#8217;,&#8217;aaaa&#8217;,0,0),
</p>
<p>
  (null,&#8217;a&#8217;,&#8217;aaaa&#8217;,0,0);
</p>
<p>
  步骤2：修改laravel数据库配置文件
</p>
<p><img loading="lazy" decoding="async" width="678" height="509" src="/wp-content/uploads/2018/05/word-image-5731.png" class="wp-image-6287" srcset="/wp-content/uploads/2018/05/word-image-5731.png 678w, /wp-content/uploads/2018/05/word-image-5731-300x225.png 300w" sizes="(max-width: 678px) 100vw, 678px" /></p>
<h2>1、留言列表</h2>
<h3>1）思路</h3>
<ul>
<li>
    步骤1：定义路由访问列表页（Admin\MsgController@index）
  </li>
<li>
    步骤2：创建控制器MsgController和方法index 并且调用视图
  </li>
<li>
    步骤3：调用视图
  </li>
<li>
    步骤4：获取数据并循环显示
  </li>
</ul>
<h3>2）代码</h3>
<ul>
<li>
    步骤1：定义路由访问列表页（Admin\MsgController@index）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1033" height="425" src="/wp-content/uploads/2018/05/word-image-5732.png" class="wp-image-6288" srcset="/wp-content/uploads/2018/05/word-image-5732.png 1033w, /wp-content/uploads/2018/05/word-image-5732-300x123.png 300w, /wp-content/uploads/2018/05/word-image-5732-768x316.png 768w, /wp-content/uploads/2018/05/word-image-5732-1024x421.png 1024w" sizes="(max-width: 1033px) 100vw, 1033px" /></p>
<ul>
<li>
    步骤2：创建控制器MsgController和方法index 并且调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1027" height="638" src="/wp-content/uploads/2018/05/word-image-5733.png" class="wp-image-6289" srcset="/wp-content/uploads/2018/05/word-image-5733.png 1027w, /wp-content/uploads/2018/05/word-image-5733-300x186.png 300w, /wp-content/uploads/2018/05/word-image-5733-768x477.png 768w, /wp-content/uploads/2018/05/word-image-5733-1024x636.png 1024w" sizes="(max-width: 1027px) 100vw, 1027px" /></p>
<ul>
<li>
    步骤3：调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1189" height="721" src="/wp-content/uploads/2018/05/word-image-5734.png" class="wp-image-6290" srcset="/wp-content/uploads/2018/05/word-image-5734.png 1189w, /wp-content/uploads/2018/05/word-image-5734-300x182.png 300w, /wp-content/uploads/2018/05/word-image-5734-768x466.png 768w, /wp-content/uploads/2018/05/word-image-5734-1024x621.png 1024w" sizes="(max-width: 1189px) 100vw, 1189px" /></p>
<ul>
<li>
    步骤4：获取数据并循环显示
  </li>
</ul>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="1157" height="460" src="/wp-content/uploads/2018/05/word-image-5735.png" class="wp-image-6291" srcset="/wp-content/uploads/2018/05/word-image-5735.png 1157w, /wp-content/uploads/2018/05/word-image-5735-300x119.png 300w, /wp-content/uploads/2018/05/word-image-5735-768x305.png 768w, /wp-content/uploads/2018/05/word-image-5735-1024x407.png 1024w" sizes="(max-width: 1157px) 100vw, 1157px" /></p>
<p>
  视图
</p>
<p><img loading="lazy" decoding="async" width="1171" height="549" src="/wp-content/uploads/2018/05/word-image-5736.png" class="wp-image-6292" srcset="/wp-content/uploads/2018/05/word-image-5736.png 1171w, /wp-content/uploads/2018/05/word-image-5736-300x141.png 300w, /wp-content/uploads/2018/05/word-image-5736-768x360.png 768w, /wp-content/uploads/2018/05/word-image-5736-1024x480.png 1024w" sizes="(max-width: 1171px) 100vw, 1171px" /><br />
<img loading="lazy" decoding="async" width="1365" height="604" src="/wp-content/uploads/2018/05/word-image-5737.png" class="wp-image-6293" srcset="/wp-content/uploads/2018/05/word-image-5737.png 1365w, /wp-content/uploads/2018/05/word-image-5737-300x133.png 300w, /wp-content/uploads/2018/05/word-image-5737-768x340.png 768w, /wp-content/uploads/2018/05/word-image-5737-1024x453.png 1024w" sizes="(max-width: 1365px) 100vw, 1365px" /></p>
<h2>2、添加留言</h2>
<h3>1）思路</h3>
<ul>
<li>
    说 明：因为添加特殊（其和列表在同一个页面所以不需要重新加载视图）
  </li>
<li>
    步骤1：修改路由
  </li>
<li>
    步骤2：控制器接受数据，并添加到数据库
  </li>
</ul>
<h3>2）代码</h3>
<ul>
<li>
    步骤1：修改路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1050" height="396" src="/wp-content/uploads/2018/05/word-image-5738.png" class="wp-image-6294" srcset="/wp-content/uploads/2018/05/word-image-5738.png 1050w, /wp-content/uploads/2018/05/word-image-5738-300x113.png 300w, /wp-content/uploads/2018/05/word-image-5738-768x290.png 768w, /wp-content/uploads/2018/05/word-image-5738-1024x386.png 1024w" sizes="(max-width: 1050px) 100vw, 1050px" /></p>
<ul>
<li>
    步骤2：控制器接受数据，并添加到数据库
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1160" height="650" src="/wp-content/uploads/2018/05/word-image-5739.png" class="wp-image-6295" srcset="/wp-content/uploads/2018/05/word-image-5739.png 1160w, /wp-content/uploads/2018/05/word-image-5739-300x168.png 300w, /wp-content/uploads/2018/05/word-image-5739-768x430.png 768w, /wp-content/uploads/2018/05/word-image-5739-1024x574.png 1024w" sizes="(max-width: 1160px) 100vw, 1160px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6202.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravel在线教育平台（一）开发背景、涉及技术点、开发周期、项目初始化、后台登录功能、路由、防翻墙、注册激活</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6025.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6025.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 15:59:47 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Laravel在线教育平台]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[后台登录功能]]></category>
		<category><![CDATA[开发周期]]></category>
		<category><![CDATA[开发背景]]></category>
		<category><![CDATA[注册激活]]></category>
		<category><![CDATA[涉及技术点]]></category>
		<category><![CDATA[路由]]></category>
		<category><![CDATA[防翻墙]]></category>
		<category><![CDATA[项目初始化]]></category>
		<guid isPermaLink="false">/?p=6025</guid>

					<description><![CDATA[Laravel框架实战-在线教育平台（1） 一、项目说明 1、开发背景 现在社会流行视频直播，应用场景：在线教 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><a id="post-6025-_Toc487731707"></a>Laravel框架实战-在线教育平台（1）</h1>
<h1><a id="post-6025-_Toc487731708"></a>一、项目说明</h1>
<h2><a id="post-6025-_Toc487731709"></a>1、开发背景</h2>
<p>
  现在社会流行视频直播，应用场景：在线教育、主播大秀、游戏直播等
</p>
<p>
  现在社会非常重视教育，各种教育机构层出不穷，教育形式多种多样，大班授课，中班
</p>
<p>
  授课，小班授课，1对1授课，但是有的学员由于地域、时间、条件、经济的限制并适合面授形式接受教育，故出现在线教育形式，即在网上就可以完成学习的过程，是一种非常灵活的学习方式。我们开发的线上教育系统，集成视频授课、试卷作答、直播课程、等功能。
</p>
<p>
  在线教育涉略的领域也非常广泛，基本上所有的教育内容都可以搬到网上进行。
</p>
<h2><a id="post-6025-_Toc487731713"></a>2、涉及到的技术点</h2>
<p>
  Datatables（无刷新分页插件）、webuploader（无刷新上传插件）、
</p>
<p>
  zyupload（多文件无刷新上传）、播放器插件、七牛接口、支付宝支付等等。
</p>
<h2><a id="post-6025-_Toc487731710"></a>3、项目开发周期规划</h2>
<ul>
<li>
    开发周期：6天（2天前台+4天后台）
  </li>
<li>
    开发框架：Laravel框架
  </li>
<li>
    开发功能：
  </li>
<li>
    后台4天：
  </li>
<li>
    后台登录功能、RBAC、专业管理、课程管理、课时管理、会员管理、试卷管理
  </li>
<li>
    前台2天：
  </li>
<li>
    登录、首页显示课程、课程详情页面、视频点播页面、视频直播页面、答题功能
  </li>
</ul>
<h1><a id="post-6025-_Toc487731715"></a>二、项目初始化</h1>
<h2><a id="post-6025-_Toc487731716"></a>1、创建项目</h2>
<p>
  步骤1：切换国内镜像
</p>
<p>
  composer config -g repo.packagist composer https://packagist.phpcomposer.com/
</p>
<p>
  步骤2：通过composer创建项目
</p>
<p>
  composer create-project laravel/laravel=5.4.* edu
</p>
<p><img loading="lazy" decoding="async" width="908" height="473" src="/wp-content/uploads/2018/05/word-image-5478.png" class="wp-image-6026" srcset="/wp-content/uploads/2018/05/word-image-5478.png 908w, /wp-content/uploads/2018/05/word-image-5478-300x156.png 300w, /wp-content/uploads/2018/05/word-image-5478-768x400.png 768w" sizes="(max-width: 908px) 100vw, 908px" /><br />
<img loading="lazy" decoding="async" width="1096" height="467" src="/wp-content/uploads/2018/05/word-image-5479.png" class="wp-image-6027" srcset="/wp-content/uploads/2018/05/word-image-5479.png 1096w, /wp-content/uploads/2018/05/word-image-5479-300x128.png 300w, /wp-content/uploads/2018/05/word-image-5479-768x327.png 768w, /wp-content/uploads/2018/05/word-image-5479-1024x436.png 1024w" sizes="(max-width: 1096px) 100vw, 1096px" /></p>
<h2><a id="post-6025-_Toc487731717"></a>开发前的准备工作</h2>
<h3><a id="post-6025-_Toc491186203"></a><a id="post-6025-_Toc493776230"></a><a id="post-6025-_Toc498268261"></a><a id="post-6025-_Toc499911971"></a>1）建立数据库开发前的准备工作</h3>
<p>
  步骤1：创建edu数据库
</p>
<p><img loading="lazy" decoding="async" width="600" height="288" src="/wp-content/uploads/2018/05/word-image-5480.png" class="wp-image-6028" srcset="/wp-content/uploads/2018/05/word-image-5480.png 600w, /wp-content/uploads/2018/05/word-image-5480-300x144.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></p>
<p>
  步骤2：修改.env配置文件
</p>
<p><img loading="lazy" decoding="async" width="787" height="455" src="/wp-content/uploads/2018/05/word-image-5481.png" class="wp-image-6029" srcset="/wp-content/uploads/2018/05/word-image-5481.png 787w, /wp-content/uploads/2018/05/word-image-5481-300x173.png 300w, /wp-content/uploads/2018/05/word-image-5481-768x444.png 768w" sizes="(max-width: 787px) 100vw, 787px" /></p>
<p>
  多学一招：utf8升级版本utf8mb4一个字符支持4个字节
</p>
<p><img loading="lazy" decoding="async" width="222" height="196" src="/wp-content/uploads/2018/05/word-image-5482.png" class="wp-image-6030" /></p>
<h3>2）设置语言包</h3>
<p>
  步骤1：下载（<a href="https://github.com/caouecs/Laravel-lang">https://github.com/caouecs/Laravel-lang</a>）
</p>
<p>
  步骤2：将zh-CH移动到resources\lang目录中
</p>
<p><img loading="lazy" decoding="async" width="763" height="424" src="/wp-content/uploads/2018/05/word-image-5483.png" class="wp-image-6031" srcset="/wp-content/uploads/2018/05/word-image-5483.png 763w, /wp-content/uploads/2018/05/word-image-5483-300x167.png 300w" sizes="(max-width: 763px) 100vw, 763px" /></p>
<p>
  步骤3：修改配置config\app.php
</p>
<p><img loading="lazy" decoding="async" width="773" height="566" src="/wp-content/uploads/2018/05/word-image-5484.png" class="wp-image-6032" srcset="/wp-content/uploads/2018/05/word-image-5484.png 773w, /wp-content/uploads/2018/05/word-image-5484-300x220.png 300w, /wp-content/uploads/2018/05/word-image-5484-768x562.png 768w" sizes="(max-width: 773px) 100vw, 773px" /></p>
<h3><a id="post-6025-_Toc499911973"></a><a id="post-6025-_Toc491186205"></a><a id="post-6025-_Toc498268263"></a><a id="post-6025-_Toc493776232"></a>设置时区为中国（config/app.php文件）</h3>
<p><img loading="lazy" decoding="async" width="713" height="285" src="/wp-content/uploads/2018/05/word-image-5485.png" class="wp-image-6033" srcset="/wp-content/uploads/2018/05/word-image-5485.png 713w, /wp-content/uploads/2018/05/word-image-5485-300x120.png 300w" sizes="(max-width: 713px) 100vw, 713px" /></p>
<h3><a id="post-6025-_Toc491186206"></a><a id="post-6025-_Toc498268264"></a><a id="post-6025-_Toc499911974"></a><a id="post-6025-_Toc493776233"></a>4）清理项目</h3>
<ul>
<li>
    删除app/Http/Controllers/Auth目录，因为需要自定义登录逻辑
  </li>
<li>
    删除
  </li>
</ul>
<p>
  database/migrations/2014_10_12_000000_create_users_table.php
</p>
<p>
  database/migrations/2014_10_12_100000_create_password_resets_table.php
</p>
<ul>
<li>
    删除resources/views/welcome.blade.php欢迎页面
  </li>
</ul>
<h3>5）session机制</h3>
<p><img loading="lazy" decoding="async" width="922" height="417" src="/wp-content/uploads/2018/05/word-image-5486.png" class="wp-image-6034" srcset="/wp-content/uploads/2018/05/word-image-5486.png 922w, /wp-content/uploads/2018/05/word-image-5486-300x136.png 300w, /wp-content/uploads/2018/05/word-image-5486-768x347.png 768w" sizes="(max-width: 922px) 100vw, 922px" /></p>
<h1><a id="post-6025-_Toc487731721"></a>后台登录功能</h1>
<h2><a id="post-6025-_Toc487731718"></a>1、创建管理员数据表</h2>
<h3><a id="post-6025-_Toc487731719"></a>1）创建管理员的数据表</h3>
<p>
  create table admin (
</p>
<p>
  id int unsigned primary key auto_increment comment &#8216;管理员ID&#8217;,
</p>
<p>
  username varchar(20) not null comment &#8216;用户名&#8217;,
</p>
<p>
  password varchar(255) not null comment &#8216;密码&#8217;,
</p>
<p>
  sex tinyint(1) unsigned not null default 1 comment &#8216;性别:1-男,2-女,3-未知&#8217;,
</p>
<p>
  mobile char(11) not null default &#8221; comment &#8216;手机号&#8217;,
</p>
<p>
  email varchar(40) not null default &#8221; comment &#8216;邮箱&#8217;,
</p>
<p>
  role_id tinyint  unsigned not null comment &#8216;角色ID&#8217;,
</p>
<p>
  created_at int unsigned not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  updated_at int unsigned not null default 0 comment &#8216;更新于&#8217;,
</p>
<p>
  state tinyint unsigned not null default 1 comment &#8216;用户状态:0-禁用,1启动&#8217;,
</p>
<p>
  remember_token varchar(255) not null default &#8221; comment &#8216;记住密码TOKEN&#8217;
</p>
<p>
  )engine=myisam charset=utf8mb4;
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p><img loading="lazy" decoding="async" width="1217" height="638" src="/wp-content/uploads/2018/05/word-image-5487.png" class="wp-image-6035" srcset="/wp-content/uploads/2018/05/word-image-5487.png 1217w, /wp-content/uploads/2018/05/word-image-5487-300x157.png 300w, /wp-content/uploads/2018/05/word-image-5487-768x403.png 768w, /wp-content/uploads/2018/05/word-image-5487-1024x537.png 1024w" sizes="(max-width: 1217px) 100vw, 1217px" /></p>
<p>
  Schema::create(&#8216;admin&#8217;, function (Blueprint $table) {
</p>
<p>
      $table-&gt;engine = &#8216;myisam&#8217;;
</p>
<p>
      $table-&gt;increments(&#8216;id&#8217;)-&gt;comment(&#8216;管理员ID&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;username&#8217;, 20)-&gt;comment(&#8216;用户名&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;password&#8217;, 255)-&gt;comment(&#8216;密码&#8217;);
</p>
<p>
      $table-&gt;unsignedTinyInteger(&#8216;sex&#8217;)-&gt;default(1)-&gt;comment(&#8216;性别:1-男,2-女,3-未知&#8217;);
</p>
<p>
      $table-&gt;char(&#8216;mobile&#8217;, 11)-&gt;default(&#8221;)-&gt;comment(&#8216;手机号&#8217;);
</p>
<p>
      $table-&gt;string(&#8217;email&#8217;, 40)-&gt;default(&#8221;)-&gt;comment(&#8216;邮箱&#8217;);
</p>
<p>
      $table-&gt;unsignedTinyInteger(&#8216;role_id&#8217;)-&gt;comment(&#8216;角色ID&#8217;);
</p>
<p>
      $table-&gt;unsignedInteger(&#8216;created_at&#8217;)-&gt;default(0)-&gt;comment(&#8216;创建于&#8217;);
</p>
<p>
      $table-&gt;unsignedInteger(&#8216;updated_at&#8217;)-&gt;default(0)-&gt;comment(&#8216;更新于&#8217;);
</p>
<p>
      $table-&gt;unsignedTinyInteger(&#8216;state&#8217;)-&gt;default(1)-&gt;comment(&#8216;用户状态:0-禁用,1-启动&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;remember_token&#8217;, 255)-&gt;default(&#8221;)-&gt;comment(&#8216;记住密码TOKEN&#8217;);
</p>
<p>
  });
</p>
<p>
  效果图
</p>
<p><img loading="lazy" decoding="async" width="1036" height="297" src="/wp-content/uploads/2018/05/word-image-5488.png" class="wp-image-6036" srcset="/wp-content/uploads/2018/05/word-image-5488.png 1036w, /wp-content/uploads/2018/05/word-image-5488-300x86.png 300w, /wp-content/uploads/2018/05/word-image-5488-768x220.png 768w, /wp-content/uploads/2018/05/word-image-5488-1024x294.png 1024w" sizes="(max-width: 1036px) 100vw, 1036px" /></p>
<h3><a id="post-6025-_Toc487731720"></a>2）插入测试数据（填充器 + Faker）</h3>
<p>
  步骤1：创建填充器
</p>
<p><img loading="lazy" decoding="async" width="1294" height="535" src="/wp-content/uploads/2018/05/word-image-5489.png" class="wp-image-6037" srcset="/wp-content/uploads/2018/05/word-image-5489.png 1294w, /wp-content/uploads/2018/05/word-image-5489-300x124.png 300w, /wp-content/uploads/2018/05/word-image-5489-768x318.png 768w, /wp-content/uploads/2018/05/word-image-5489-1024x423.png 1024w" sizes="(max-width: 1294px) 100vw, 1294px" /></p>
<p>
  public function run()
</p>
<p>
  {
</p>
<p>
      $faker = Faker\Factory::create(&#8216;zh_CN&#8217;);
</p>
<p>
      for ($i = 1; $i&lt;30; $i++) {
</p>
<p>
          DB::table(&#8216;admin&#8217;)-&gt;insert([
</p>
<p>
              &#8216;username&#8217; =&gt; $faker-&gt;userName,
</p>
<p>
              &#8216;password&#8217; =&gt; bcrypt($faker-&gt;password),
</p>
<p>
              &#8216;sex&#8217; =&gt; mt_rand(1,3),
</p>
<p>
              &#8216;mobile&#8217; =&gt; $faker-&gt;phoneNumber,
</p>
<p>
              &#8217;email&#8217; =&gt; $faker-&gt;email,
</p>
<p>
              &#8216;role_id&#8217; =&gt; mt_rand(1,150),
</p>
<p>
              &#8216;created_at&#8217; =&gt; time(),
</p>
<p>
              &#8216;updated_at&#8217; =&gt; time()
</p>
<p>
          ]);
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  步骤2：执行填充器
</p>
<p><img loading="lazy" decoding="async" width="944" height="404" src="/wp-content/uploads/2018/05/word-image-5490.png" class="wp-image-6038" srcset="/wp-content/uploads/2018/05/word-image-5490.png 944w, /wp-content/uploads/2018/05/word-image-5490-300x128.png 300w, /wp-content/uploads/2018/05/word-image-5490-768x329.png 768w" sizes="(max-width: 944px) 100vw, 944px" /></p>
<h2><a id="post-6025-_Toc487731722"></a>2、显示登录页</h2>
<h3>1）后台静态模板介绍</h3>
<ul>
<li>
    模版文件：H-ui Admin后台模版
  </li>
<li>
    下载地址：http://www.h-ui.net/H-ui.admin.shtml
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="711" height="167" src="/wp-content/uploads/2018/05/word-image-5491.png" class="wp-image-6039" srcset="/wp-content/uploads/2018/05/word-image-5491.png 711w, /wp-content/uploads/2018/05/word-image-5491-300x70.png 300w" sizes="(max-width: 711px) 100vw, 711px" /></p>
<h3>2）显示登录页</h3>
<p>
  步骤1：
</p>
<p>
  创建路由，访问/admin/login就通过Admin\LoginController@login加载视图
</p>
<p><img loading="lazy" decoding="async" width="1198" height="324" src="/wp-content/uploads/2018/05/word-image-5492.png" class="wp-image-6040" srcset="/wp-content/uploads/2018/05/word-image-5492.png 1198w, /wp-content/uploads/2018/05/word-image-5492-300x81.png 300w, /wp-content/uploads/2018/05/word-image-5492-768x208.png 768w, /wp-content/uploads/2018/05/word-image-5492-1024x277.png 1024w" sizes="(max-width: 1198px) 100vw, 1198px" /></p>
<p>
  步骤2：创建登录控制器和方法，并在方法中加载视图
</p>
<p><img loading="lazy" decoding="async" width="1057" height="509" src="/wp-content/uploads/2018/05/word-image-5493.png" class="wp-image-6041" srcset="/wp-content/uploads/2018/05/word-image-5493.png 1057w, /wp-content/uploads/2018/05/word-image-5493-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5493-768x370.png 768w, /wp-content/uploads/2018/05/word-image-5493-1024x493.png 1024w" sizes="(max-width: 1057px) 100vw, 1057px" /></p>
<p>
  步骤3：创建视图
</p>
<p><img loading="lazy" decoding="async" width="892" height="691" src="/wp-content/uploads/2018/05/word-image-5494.png" class="wp-image-6042" srcset="/wp-content/uploads/2018/05/word-image-5494.png 892w, /wp-content/uploads/2018/05/word-image-5494-300x232.png 300w, /wp-content/uploads/2018/05/word-image-5494-768x595.png 768w" sizes="(max-width: 892px) 100vw, 892px" /></p>
<p>
  效果
</p>
<p><img loading="lazy" decoding="async" width="811" height="546" src="/wp-content/uploads/2018/05/word-image-5495.png" class="wp-image-6043" srcset="/wp-content/uploads/2018/05/word-image-5495.png 811w, /wp-content/uploads/2018/05/word-image-5495-300x202.png 300w, /wp-content/uploads/2018/05/word-image-5495-768x517.png 768w" sizes="(max-width: 811px) 100vw, 811px" /></p>
<h2>登录数据处理（用户认证，使用Auth做登录和退出功能）</h2>
<h3>用户认证（Auth）相关语法</h3>
<p>
  验证信息并登陆：Auth::guard(参数)-&gt;attempt（用户名和密码数组，是否保存用户状态:true-是,false-否）
</p>
<p>
  检查状态：Auth::guard(参数)-&gt;check（）
</p>
<p>
  获得登陆用户：Auth::guard(参数)-&gt;user（）-&gt;键
</p>
<p>
  退出登录：Auth::guard(参数)-&gt;logout（）
</p>
<h3>2）准备</h3>
<p><strong>步骤1：创建模型（注：因为该模型需要使用Auth类所以必须实现指定接口）</strong>
</p>
<p><img loading="lazy" decoding="async" width="1172" height="523" src="/wp-content/uploads/2018/05/word-image-5496.png" class="wp-image-6044" srcset="/wp-content/uploads/2018/05/word-image-5496.png 1172w, /wp-content/uploads/2018/05/word-image-5496-300x134.png 300w, /wp-content/uploads/2018/05/word-image-5496-768x343.png 768w, /wp-content/uploads/2018/05/word-image-5496-1024x457.png 1024w" sizes="(max-width: 1172px) 100vw, 1172px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Auth\Authenticatable;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Admin extends Model implements \Illuminate\Contracts\Auth\Authenticatable
</p>
<p>
  {
</p>
<p>
      use Authenticatable;
</p>
<p>
      /**
</p>
<p>
       * 声明表名
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;admin&#8217;;
</p>
<p>
  }
</p>
<p>
  步骤2：修改config/auth.php用户认证配置文件，目的设置（验证用户信息并登陆语法中的参数 Auth::guard(参数)）
</p>
<p><img loading="lazy" decoding="async" width="1086" height="457" src="/wp-content/uploads/2018/05/word-image-5497.png" class="wp-image-6045" srcset="/wp-content/uploads/2018/05/word-image-5497.png 1086w, /wp-content/uploads/2018/05/word-image-5497-300x126.png 300w, /wp-content/uploads/2018/05/word-image-5497-768x323.png 768w, /wp-content/uploads/2018/05/word-image-5497-1024x431.png 1024w" sizes="(max-width: 1086px) 100vw, 1086px" /><br />
<img loading="lazy" decoding="async" width="1005" height="271" src="/wp-content/uploads/2018/05/word-image-5498.png" class="wp-image-6046" srcset="/wp-content/uploads/2018/05/word-image-5498.png 1005w, /wp-content/uploads/2018/05/word-image-5498-300x81.png 300w, /wp-content/uploads/2018/05/word-image-5498-768x207.png 768w" sizes="(max-width: 1005px) 100vw, 1005px" /></p>
<h3>代码1：身份验证</h3>
<p>
  步骤1：修改路由，既可以get又可以post
</p>
<p><img loading="lazy" decoding="async" width="1124" height="370" src="/wp-content/uploads/2018/05/word-image-5499.png" class="wp-image-6047" srcset="/wp-content/uploads/2018/05/word-image-5499.png 1124w, /wp-content/uploads/2018/05/word-image-5499-300x99.png 300w, /wp-content/uploads/2018/05/word-image-5499-768x253.png 768w, /wp-content/uploads/2018/05/word-image-5499-1024x337.png 1024w" sizes="(max-width: 1124px) 100vw, 1124px" /></p>
<p>
  步骤2：修改登录form表单参数
</p>
<p><img loading="lazy" decoding="async" width="1129" height="588" src="/wp-content/uploads/2018/05/word-image-5500.png" class="wp-image-6048" srcset="/wp-content/uploads/2018/05/word-image-5500.png 1129w, /wp-content/uploads/2018/05/word-image-5500-300x156.png 300w, /wp-content/uploads/2018/05/word-image-5500-768x400.png 768w, /wp-content/uploads/2018/05/word-image-5500-1024x533.png 1024w" sizes="(max-width: 1129px) 100vw, 1129px" /></p>
<p>
  步骤3：在login方法中增加判断是否post提交，否-则加载视图，是-则接受数据，并调用Auth类的验证信息并登录方法实现登录功能
</p>
<p><img loading="lazy" decoding="async" width="1211" height="603" src="/wp-content/uploads/2018/05/word-image-5501.png" class="wp-image-6049" srcset="/wp-content/uploads/2018/05/word-image-5501.png 1211w, /wp-content/uploads/2018/05/word-image-5501-300x149.png 300w, /wp-content/uploads/2018/05/word-image-5501-768x382.png 768w, /wp-content/uploads/2018/05/word-image-5501-1024x510.png 1024w" sizes="(max-width: 1211px) 100vw, 1211px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p><strong>use Illuminate\Support\Facades\Auth;</strong>
</p>
<p>
  class LoginController extends Controller
</p>
<p>
  {
</p>
<p>
      //加载登录视图
</p>
<p>
      public function login(Request $request)
</p>
<p>
      {
</p>
<p>
          //1.判断HTTP请求类型
</p>
<p>
          if ($request-&gt;isMethod(&#8216;post&#8217;)) {
</p>
<p>
              //2.接受数据
</p>
<p>
              $postData = $request-&gt;only([&#8216;username&#8217;, &#8216;password&#8217;]);
</p>
<p>
              //3.验证身份 并 登录（注：也就是调用Auth类的方法会自动帮我们验证数据并且保存session）
</p>
<p>
              //语法；Auth::guard(参数)-&gt;attempt(用户名和密码数组，是否保存用户状态:true-是,false-否)
</p>
<p>
                                                                   //true-后期相当于cookie存储，false-session
</p>
<p>
           <strong>  $rs = Auth::guard(&#8216;admin&#8217;)-&gt;attempt($postData, $request-&gt;only(&#8216;online&#8217;)[&#8216;online&#8217;]);</strong>
</p>
<p>
             //4.判断用户是否登录成功
</p>
<p>
              if ($rs) {
</p>
<p>
                  return redirect(&#8216;admin/index/index&#8217;);
</p>
<p>
              } else {
</p>
<p>
                  return redirect(&#8216;admin/login&#8217;);
</p>
<p>
              }
</p>
<p>
          } else {
</p>
<p>
              //2.加载视图
</p>
<p>
              return view(&#8216;admin.login.login&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<h3>代码2：数据过滤</h3>
<p>
  用户名：必须，3~2个字符
</p>
<p>
  密码：必须，6~32个字符
</p>
<p>
  验证码：必须，5个字符
</p>
<p><strong>步骤1：控制器通过validate方法进行数据过滤</strong>
</p>
<p><img loading="lazy" decoding="async" width="1230" height="335" src="/wp-content/uploads/2018/05/word-image-5502.png" class="wp-image-6050" srcset="/wp-content/uploads/2018/05/word-image-5502.png 1230w, /wp-content/uploads/2018/05/word-image-5502-300x82.png 300w, /wp-content/uploads/2018/05/word-image-5502-768x209.png 768w, /wp-content/uploads/2018/05/word-image-5502-1024x279.png 1024w" sizes="(max-width: 1230px) 100vw, 1230px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  use Illuminate\Support\Facades\Auth;
</p>
<p>
  class LoginController extends Controller
</p>
<p>
  {
</p>
<p>
      //加载登录视图
</p>
<p>
      public function login(Request $request)
</p>
<p>
      {
</p>
<p>
          //1.判断HTTP请求类型
</p>
<p>
          if ($request-&gt;isMethod(&#8216;post&#8217;)) {
</p>
<p>
            <strong>  //数据过滤，发送HTTP请求进行验证：成功-则不管，失败-重定向到来源页面，并给视图传递$errors变量</strong>
</p>
<p><strong>            $this-&gt;validate($request, [</strong>
</p>
<p><strong>                &#8216;username&#8217; =&gt; &#8216;required|min:2|max:10&#8217;,</strong>
</p>
<p><strong>                &#8216;password&#8217; =&gt; &#8216;required|min:6|max:32&#8217;,</strong>
</p>
<p><strong>                &#8216;captcha&#8217; =&gt; &#8216;required|size:5&#8217;,</strong>
</p>
<p><strong>            ]);</strong>
</p>
<p>
              //2.接受数据
</p>
<p>
              $postData = $request-&gt;only([&#8216;username&#8217;, &#8216;password&#8217;]);
</p>
<p>
              //3.验证身份 并 登录（注：也就是调用Auth类的方法会自动帮我们验证数据并且保存session）
</p>
<p>
              //语法；Auth::guard(参数)-&gt;attempt(用户名和密码数组，是否保存用户状态:true-是,false-否)
</p>
<p>
              //true-后期相当于cookie存储，false-session
</p>
<p>
              $rs = Auth::guard(&#8216;admin&#8217;)-&gt;attempt($postData, $request-&gt;only(&#8216;online&#8217;)[&#8216;online&#8217;]);
</p>
<p>
              //4.判断用户是否登录成功
</p>
<p>
              if ($rs) {
</p>
<p>
                  return redirect(&#8216;admin/index/index&#8217;);
</p>
<p>
              } else {
</p>
<p>
                  return redirect(&#8216;admin/login&#8217;);
</p>
<p>
              }
</p>
<p>
          } else {
</p>
<p>
              //2.加载视图
</p>
<p>
              return view(&#8216;admin.login.login&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p><strong>步骤2：视图弹出错误信息</strong>
</p>
<p><img loading="lazy" decoding="async" width="878" height="363" src="/wp-content/uploads/2018/05/word-image-5503.png" class="wp-image-6051" srcset="/wp-content/uploads/2018/05/word-image-5503.png 878w, /wp-content/uploads/2018/05/word-image-5503-300x124.png 300w, /wp-content/uploads/2018/05/word-image-5503-768x318.png 768w" sizes="(max-width: 878px) 100vw, 878px" /></p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  @if (count($errors) &gt; 0)
</p>
<p>
      var errors = &#8221;;
</p>
<p>
      @foreach ($errors-&gt;all() as $error)
</p>
<p>
          errors += &#8220;{{ $error }} \n&#8221;;
</p>
<p>
      @endforeach
</p>
<p>
      alert(errors);
</p>
<p>
  @endif
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p><strong>步骤3：发现验证码captcha不能被识别</strong>
</p>
<p><img loading="lazy" decoding="async" width="941" height="284" src="/wp-content/uploads/2018/05/word-image-5504.png" class="wp-image-6052" srcset="/wp-content/uploads/2018/05/word-image-5504.png 941w, /wp-content/uploads/2018/05/word-image-5504-300x91.png 300w, /wp-content/uploads/2018/05/word-image-5504-768x232.png 768w" sizes="(max-width: 941px) 100vw, 941px" /><br />
<img loading="lazy" decoding="async" width="954" height="417" src="/wp-content/uploads/2018/05/word-image-5505.png" class="wp-image-6053" srcset="/wp-content/uploads/2018/05/word-image-5505.png 954w, /wp-content/uploads/2018/05/word-image-5505-300x131.png 300w, /wp-content/uploads/2018/05/word-image-5505-768x336.png 768w" sizes="(max-width: 954px) 100vw, 954px" /><br />
<img loading="lazy" decoding="async" width="1007" height="341" src="/wp-content/uploads/2018/05/word-image-5506.png" class="wp-image-6054" srcset="/wp-content/uploads/2018/05/word-image-5506.png 1007w, /wp-content/uploads/2018/05/word-image-5506-300x102.png 300w, /wp-content/uploads/2018/05/word-image-5506-768x260.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" /></p>
<h2><a id="post-6025-_Toc487731724"></a>4、登录验证码（mews/captcha）</h2>
<h3>1）通过composer下载验证码类库 并 激活</h3>
<p>
  步骤1：下载
</p>
<p><img loading="lazy" decoding="async" width="776" height="401" src="/wp-content/uploads/2018/05/word-image-5507.png" class="wp-image-6055" srcset="/wp-content/uploads/2018/05/word-image-5507.png 776w, /wp-content/uploads/2018/05/word-image-5507-300x155.png 300w, /wp-content/uploads/2018/05/word-image-5507-768x397.png 768w" sizes="(max-width: 776px) 100vw, 776px" /></p>
<p>
  步骤2：打开config\app.php进行机会
</p>
<p><img loading="lazy" decoding="async" width="1029" height="313" src="/wp-content/uploads/2018/05/word-image-5508.png" class="wp-image-6056" srcset="/wp-content/uploads/2018/05/word-image-5508.png 1029w, /wp-content/uploads/2018/05/word-image-5508-300x91.png 300w, /wp-content/uploads/2018/05/word-image-5508-768x234.png 768w, /wp-content/uploads/2018/05/word-image-5508-1024x311.png 1024w" sizes="(max-width: 1029px) 100vw, 1029px" /><br />
<img loading="lazy" decoding="async" width="985" height="248" src="/wp-content/uploads/2018/05/word-image-5509.png" class="wp-image-6057" srcset="/wp-content/uploads/2018/05/word-image-5509.png 985w, /wp-content/uploads/2018/05/word-image-5509-300x76.png 300w, /wp-content/uploads/2018/05/word-image-5509-768x193.png 768w" sizes="(max-width: 985px) 100vw, 985px" /></p>
<p>
  步骤3：打开视图显示验证码
</p>
<p><img loading="lazy" decoding="async" width="828" height="276" src="/wp-content/uploads/2018/05/word-image-5510.png" class="wp-image-6058" srcset="/wp-content/uploads/2018/05/word-image-5510.png 828w, /wp-content/uploads/2018/05/word-image-5510-300x100.png 300w, /wp-content/uploads/2018/05/word-image-5510-768x256.png 768w" sizes="(max-width: 828px) 100vw, 828px" /></p>
<p>
  效果
</p>
<p><img loading="lazy" decoding="async" width="503" height="239" src="/wp-content/uploads/2018/05/word-image-5511.png" class="wp-image-6059" srcset="/wp-content/uploads/2018/05/word-image-5511.png 503w, /wp-content/uploads/2018/05/word-image-5511-300x143.png 300w" sizes="(max-width: 503px) 100vw, 503px" /></p>
<h3>视图显示验证码，并实现点击切换</h3>
<p><img loading="lazy" decoding="async" width="1216" height="261" src="/wp-content/uploads/2018/05/word-image-5512.png" class="wp-image-6060" srcset="/wp-content/uploads/2018/05/word-image-5512.png 1216w, /wp-content/uploads/2018/05/word-image-5512-300x64.png 300w, /wp-content/uploads/2018/05/word-image-5512-768x165.png 768w, /wp-content/uploads/2018/05/word-image-5512-1024x220.png 1024w" sizes="(max-width: 1216px) 100vw, 1216px" /></p>
<p>
  &lt;img src=&#8221;{{ Captcha::src() }}&#8221; onclick=&#8221;this.src = &#8216;{{ Captcha::src() }}&#8217; + &#8216;&amp;_=&#8217;+Math.random()&#8221;&gt;
</p>
<h3>控制器判断验证码是否正确</h3>
<p>
  步骤1：直接在validate方法中使用captcha验证规则即可
</p>
<p><img loading="lazy" decoding="async" width="939" height="299" src="/wp-content/uploads/2018/05/word-image-5513.png" class="wp-image-6061" srcset="/wp-content/uploads/2018/05/word-image-5513.png 939w, /wp-content/uploads/2018/05/word-image-5513-300x96.png 300w, /wp-content/uploads/2018/05/word-image-5513-768x245.png 768w" sizes="(max-width: 939px) 100vw, 939px" /></p>
<p>
   步骤2：提示汉化
</p>
<p><img loading="lazy" decoding="async" width="957" height="293" src="/wp-content/uploads/2018/05/word-image-5514.png" class="wp-image-6062" srcset="/wp-content/uploads/2018/05/word-image-5514.png 957w, /wp-content/uploads/2018/05/word-image-5514-300x92.png 300w, /wp-content/uploads/2018/05/word-image-5514-768x235.png 768w" sizes="(max-width: 957px) 100vw, 957px" /></p>
<h1><a id="post-6025-_Toc487731727"></a>四、后台首页展示</h1>
<h2>1、显示后台首页</h2>
<p>
  步骤1：定义路由  /admin/index/index  对应  Admin\IndexController@index
</p>
<p><img loading="lazy" decoding="async" width="1025" height="356" src="/wp-content/uploads/2018/05/word-image-5515.png" class="wp-image-6063" srcset="/wp-content/uploads/2018/05/word-image-5515.png 1025w, /wp-content/uploads/2018/05/word-image-5515-300x104.png 300w, /wp-content/uploads/2018/05/word-image-5515-768x267.png 768w, /wp-content/uploads/2018/05/word-image-5515-1024x356.png 1024w" sizes="(max-width: 1025px) 100vw, 1025px" /></p>
<p>
  步骤2：创建控制器和方法并调用视图
</p>
<p><img loading="lazy" decoding="async" width="1098" height="522" src="/wp-content/uploads/2018/05/word-image-5516.png" class="wp-image-6064" srcset="/wp-content/uploads/2018/05/word-image-5516.png 1098w, /wp-content/uploads/2018/05/word-image-5516-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5516-768x365.png 768w, /wp-content/uploads/2018/05/word-image-5516-1024x487.png 1024w" sizes="(max-width: 1098px) 100vw, 1098px" /></p>
<p>
  步骤3：创建视图
</p>
<p><img loading="lazy" decoding="async" width="1098" height="660" src="/wp-content/uploads/2018/05/word-image-5517.png" class="wp-image-6065" srcset="/wp-content/uploads/2018/05/word-image-5517.png 1098w, /wp-content/uploads/2018/05/word-image-5517-300x180.png 300w, /wp-content/uploads/2018/05/word-image-5517-768x462.png 768w, /wp-content/uploads/2018/05/word-image-5517-1024x616.png 1024w" sizes="(max-width: 1098px) 100vw, 1098px" /></p>
<h2>2、显示后台欢迎页</h2>
<p>
  步骤1：定义路由
</p>
<p><img loading="lazy" decoding="async" width="1100" height="355" src="/wp-content/uploads/2018/05/word-image-5518.png" class="wp-image-6066" srcset="/wp-content/uploads/2018/05/word-image-5518.png 1100w, /wp-content/uploads/2018/05/word-image-5518-300x97.png 300w, /wp-content/uploads/2018/05/word-image-5518-768x248.png 768w, /wp-content/uploads/2018/05/word-image-5518-1024x330.png 1024w" sizes="(max-width: 1100px) 100vw, 1100px" /></p>
<p>
  步骤2：创建控制器和方法
</p>
<p><img loading="lazy" decoding="async" width="858" height="519" src="/wp-content/uploads/2018/05/word-image-5519.png" class="wp-image-6067" srcset="/wp-content/uploads/2018/05/word-image-5519.png 858w, /wp-content/uploads/2018/05/word-image-5519-300x181.png 300w, /wp-content/uploads/2018/05/word-image-5519-768x465.png 768w" sizes="(max-width: 858px) 100vw, 858px" /></p>
<p>
  步骤3：创建视图
</p>
<p><img loading="lazy" decoding="async" width="1044" height="556" src="/wp-content/uploads/2018/05/word-image-5520.png" class="wp-image-6068" srcset="/wp-content/uploads/2018/05/word-image-5520.png 1044w, /wp-content/uploads/2018/05/word-image-5520-300x160.png 300w, /wp-content/uploads/2018/05/word-image-5520-768x409.png 768w, /wp-content/uploads/2018/05/word-image-5520-1024x545.png 1024w" sizes="(max-width: 1044px) 100vw, 1044px" /></p>
<p>
  步骤4：修改后台首页的iframe的src地址
</p>
<p><img loading="lazy" decoding="async" width="1143" height="334" src="/wp-content/uploads/2018/05/word-image-5521.png" class="wp-image-6069" srcset="/wp-content/uploads/2018/05/word-image-5521.png 1143w, /wp-content/uploads/2018/05/word-image-5521-300x88.png 300w, /wp-content/uploads/2018/05/word-image-5521-768x224.png 768w, /wp-content/uploads/2018/05/word-image-5521-1024x299.png 1024w" sizes="(max-width: 1143px) 100vw, 1143px" /></p>
<p>
  效果
</p>
<p><img loading="lazy" decoding="async" width="1072" height="476" src="/wp-content/uploads/2018/05/word-image-5522.png" class="wp-image-6070" srcset="/wp-content/uploads/2018/05/word-image-5522.png 1072w, /wp-content/uploads/2018/05/word-image-5522-300x133.png 300w, /wp-content/uploads/2018/05/word-image-5522-768x341.png 768w, /wp-content/uploads/2018/05/word-image-5522-1024x455.png 1024w" sizes="(max-width: 1072px) 100vw, 1072px" /></p>
<h2>3、显示后台首页右上角（当前登录用户名称）</h2>
<p><img loading="lazy" decoding="async" width="1317" height="467" src="/wp-content/uploads/2018/05/word-image-5523.png" class="wp-image-6071" srcset="/wp-content/uploads/2018/05/word-image-5523.png 1317w, /wp-content/uploads/2018/05/word-image-5523-300x106.png 300w, /wp-content/uploads/2018/05/word-image-5523-768x272.png 768w, /wp-content/uploads/2018/05/word-image-5523-1024x363.png 1024w" sizes="(max-width: 1317px) 100vw, 1317px" /></p>
<h2>退出功能</h2>
<p>
  步骤1：定义路由
</p>
<p><img loading="lazy" decoding="async" width="1153" height="398" src="/wp-content/uploads/2018/05/word-image-5524.png" class="wp-image-6072" srcset="/wp-content/uploads/2018/05/word-image-5524.png 1153w, /wp-content/uploads/2018/05/word-image-5524-300x104.png 300w, /wp-content/uploads/2018/05/word-image-5524-768x265.png 768w, /wp-content/uploads/2018/05/word-image-5524-1024x353.png 1024w" sizes="(max-width: 1153px) 100vw, 1153px" /></p>
<p>
  步骤2：书写退出功能代码
</p>
<p><img loading="lazy" decoding="async" width="1134" height="393" src="/wp-content/uploads/2018/05/word-image-5525.png" class="wp-image-6073" srcset="/wp-content/uploads/2018/05/word-image-5525.png 1134w, /wp-content/uploads/2018/05/word-image-5525-300x104.png 300w, /wp-content/uploads/2018/05/word-image-5525-768x266.png 768w, /wp-content/uploads/2018/05/word-image-5525-1024x355.png 1024w" sizes="(max-width: 1134px) 100vw, 1134px" /></p>
<p>
  步骤3：设置退出连接
</p>
<p><img loading="lazy" decoding="async" width="1012" height="333" src="/wp-content/uploads/2018/05/word-image-5526.png" class="wp-image-6074" srcset="/wp-content/uploads/2018/05/word-image-5526.png 1012w, /wp-content/uploads/2018/05/word-image-5526-300x99.png 300w, /wp-content/uploads/2018/05/word-image-5526-768x253.png 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></p>
<h1>五、防翻墙</h1>
<h2>1、创建中间件，并书写过滤代码</h2>
<p><img loading="lazy" decoding="async" width="1284" height="617" src="/wp-content/uploads/2018/05/word-image-5527.png" class="wp-image-6075" srcset="/wp-content/uploads/2018/05/word-image-5527.png 1284w, /wp-content/uploads/2018/05/word-image-5527-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5527-768x369.png 768w, /wp-content/uploads/2018/05/word-image-5527-1024x492.png 1024w" sizes="(max-width: 1284px) 100vw, 1284px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Middleware;
</p>
<p>
  use Closure;
</p>
<p>
  use Illuminate\Support\Facades\Auth;
</p>
<p>
  class CheckAdminLogin
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * Handle an incoming request.
</p>
<p>
       *
</p>
<p>
       * @param  \Illuminate\Http\Request  $request
</p>
<p>
       * @param  \Closure  $next
</p>
<p>
       * @return mixed
</p>
<p>
       */
</p>
<p>
      public function handle($request, Closure $next)
</p>
<p>
      {
</p>
<p>
          if (!Auth::guard(&#8216;admin&#8217;)-&gt;check()) {
</p>
<p>
              return redirect(&#8216;admin/login&#8217;)-&gt;withErrors([&#8216;errors&#8217; =&gt; &#8216;登录超时，请重新登录&#8217;]);
</p>
<p>
          }
</p>
<p>
          return $next($request);
</p>
<p>
      }
</p>
<p>
  }
</p>
<h2>注册激活</h2>
<p><img loading="lazy" decoding="async" width="1199" height="422" src="/wp-content/uploads/2018/05/word-image-5528.png" class="wp-image-6076" srcset="/wp-content/uploads/2018/05/word-image-5528.png 1199w, /wp-content/uploads/2018/05/word-image-5528-300x106.png 300w, /wp-content/uploads/2018/05/word-image-5528-768x270.png 768w, /wp-content/uploads/2018/05/word-image-5528-1024x360.png 1024w" sizes="(max-width: 1199px) 100vw, 1199px" /></p>
<h2>3、路由使用</h2>
<p><img loading="lazy" decoding="async" width="1219" height="446" src="/wp-content/uploads/2018/05/word-image-5529.png" class="wp-image-6077" srcset="/wp-content/uploads/2018/05/word-image-5529.png 1219w, /wp-content/uploads/2018/05/word-image-5529-300x110.png 300w, /wp-content/uploads/2018/05/word-image-5529-768x281.png 768w, /wp-content/uploads/2018/05/word-image-5529-1024x375.png 1024w" sizes="(max-width: 1219px) 100vw, 1219px" /></p>
<p>
  &lt;?php
</p>
<p>
  //后台登录
</p>
<p>
  Route::match([&#8216;get&#8217;, &#8216;post&#8217;], &#8216;admin/login&#8217;, &#8216;Admin\LoginController@login&#8217;);
</p>
<p>
  Route::group([&#8216;middleware&#8217; =&gt; &#8216;CheckAdminLogin&#8217;], function(){
</p>
<p>
  //退出功能
</p>
<p>
      Route::get(&#8216;admin/loginout&#8217;, &#8216;Admin\LoginController@loginout&#8217;);
</p>
<p>
  //后台首页
</p>
<p>
      Route::get(&#8216;admin/index/index&#8217;, &#8216;Admin\IndexController@index&#8217;);
</p>
<p>
      Route::get(&#8216;admin/index/welcome&#8217;, &#8216;Admin\IndexController@welcome&#8217;);
</p>
<p>
  });
</p>
<h1><a id="post-6025-_Toc487731728"></a>六、管理员管理</h1>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6025.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP 3.2 （一）配置、路由、模型、视图、控制器、商城后台首页展示</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/4022.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/4022.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 13:08:24 +0000</pubDate>
				<category><![CDATA[TP3.2]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[商城后台首页展示]]></category>
		<category><![CDATA[控制器]]></category>
		<category><![CDATA[模型]]></category>
		<category><![CDATA[视图]]></category>
		<category><![CDATA[路由]]></category>
		<category><![CDATA[配置]]></category>
		<guid isPermaLink="false">/?p=4022</guid>

					<description><![CDATA[框架概述 1.1、回顾MVC(重点理解) MVC是一个编程思想。将业务拆分成为三个板块分别为模型、视图以及控制 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>框架概述</h1>
<h2>1.1、回顾MVC(重点理解)</h2>
<p>
  MVC是一个编程思想。将业务拆分成为三个板块分别为模型、视图以及控制器
</p>
<p>
  M代表是的模型主要是进行数据交互
</p>
<p>
  V代表的就是视图主要是与用户进行交互
</p>
<p>
  C代表是控制器作用作用是进行中间的协同工作。调度模型或者视图完成工作
</p>
<p><img loading="lazy" decoding="async" width="1159" height="486" src="/wp-content/uploads/2018/05/word-image-3566.png" class="wp-image-4023" srcset="/wp-content/uploads/2018/05/word-image-3566.png 1159w, /wp-content/uploads/2018/05/word-image-3566-300x126.png 300w, /wp-content/uploads/2018/05/word-image-3566-768x322.png 768w, /wp-content/uploads/2018/05/word-image-3566-1024x429.png 1024w" sizes="(max-width: 1159px) 100vw, 1159px" /></p>
<h2>1.2、什么是框架</h2>
<p>
  框架就是一个半成品的代码库。包括很多的基础功能，能够方便进行项目的开发。使用框架进行项目开发可以节省开发时间。
</p>
<p>
  例如：在前端页面上进行dom操作。可以使用原生的js进行。也可以使用jQuery来进行dom操作。此处jQuery就是前端的一款框架
</p>
<h2>1.3、PHP的常用框架</h2>
<ol>
<li>
  zendframework：由zend公司开发的一款重量级的框架
</li>
<li>
  YII：基于组件的一款框架
</li>
<li>
  CI框架：一款比较轻量的框架
</li>
<li>
  laravel框架：最优雅的框架
</li>
</ol>
<p>
  5、thinkPHP框架：国产框架
</p>
<h2>1.4、TP框架的优点</h2>
<p>
  国产思想符合国人、代码注释都是中文。并且使用量比较大。社区活跃(问题能够及时解决)
</p>
<h1>TP框架的基本使用</h1>
<h2>2.1、TP源码下载</h2>
<p>
  官方网址：<a href="/goto/hl2v" rel="nofollow">http://www.thinkphp.cn/</a>
</p>
<h3>2.1.1、关于版本的选择</h3>
<p>
  3.2版本：主要是针对于web项目(有前台后台)
</p>
<p>
  5.0版本：主要针对api接口项目(全部都是写接口)
</p>
<p>
  关于实际在开发项目中版本的选择没有严格的界限。例如web项目也可以使用5.0版本。写接口也可以使用3.2版本
</p>
<h3>2.1.2、下载TP3.2版本源代码</h3>
<p><img loading="lazy" decoding="async" width="1117" height="405" src="/wp-content/uploads/2018/05/word-image-3567.png" class="wp-image-4024" srcset="/wp-content/uploads/2018/05/word-image-3567.png 1117w, /wp-content/uploads/2018/05/word-image-3567-300x109.png 300w, /wp-content/uploads/2018/05/word-image-3567-768x278.png 768w, /wp-content/uploads/2018/05/word-image-3567-1024x371.png 1024w" sizes="(max-width: 1117px) 100vw, 1117px" /></p>
<p>
  关于核心版本与完整版的区别。对于核心版本只包括了框架的基本功能。对于完整版本除了框架基本内容之外还包括其他的功能。例如分页、文件上传等
</p>
<h2>2.2、TP框架项目部署(实现)</h2>
<h3>2.2.1、解析下载的源代码目录文件</h3>
<p>
  ①解析下载的源码
</p>
<p><img loading="lazy" decoding="async" width="769" height="274" src="/wp-content/uploads/2018/05/word-image-3568.png" class="wp-image-4025" srcset="/wp-content/uploads/2018/05/word-image-3568.png 769w, /wp-content/uploads/2018/05/word-image-3568-300x107.png 300w, /wp-content/uploads/2018/05/word-image-3568-768x274.png 768w" sizes="(max-width: 769px) 100vw, 769px" /></p>
<p>
  Application:TP默认的应用代码存储的目录(存储自己编写的代码)
</p>
<p>
  Public：TP推荐的存储资源文件的目录
</p>
<p>
  ThinkPHP:TP框架的源代码目录
</p>
<p>
  .htaccess:Apache的重写规则文件
</p>
<p>
  composer.json：composer的配置文件。composer是PHP的代码管理工具
</p>
<p>
  Index.php：项目的入口文件(非常重要)
</p>
<p>
  ②TP框架的源码目录
</p>
<p><img loading="lazy" decoding="async" width="939" height="382" src="/wp-content/uploads/2018/05/word-image-3569.png" class="wp-image-4026" srcset="/wp-content/uploads/2018/05/word-image-3569.png 939w, /wp-content/uploads/2018/05/word-image-3569-300x122.png 300w, /wp-content/uploads/2018/05/word-image-3569-768x312.png 768w" sizes="(max-width: 939px) 100vw, 939px" /></p>
<p>
  Common：存储TP所提供的公共函数文件。对于此目录下的functions.php中的函数可以在任何位置直接使用
</p>
<p>
  Conf:TP的默认配置信息目录
</p>
<p>
  Lang:TP的语言包
</p>
<p>
  Library：TP框架的核心的类库目录
</p>
<p>
  Mode：TP所支持的模式
</p>
<p>
  Tpl：TP默认的系统模板目录
</p>
<p>
  ThinkPHP.php:tp框架的入口文件(在项目的入口文件中必须要载入此文件来载入整个TP框架)
</p>
<h3>2.2.2、创建项目</h3>
<p>
  ①创建项目目录
</p>
<p><img loading="lazy" decoding="async" width="643" height="100" src="/wp-content/uploads/2018/05/word-image-3570.png" class="wp-image-4027" srcset="/wp-content/uploads/2018/05/word-image-3570.png 643w, /wp-content/uploads/2018/05/word-image-3570-300x47.png 300w" sizes="(max-width: 643px) 100vw, 643px" /></p>
<p>
  ②拷贝TP的框架源代码
</p>
<p><img loading="lazy" decoding="async" width="1232" height="332" src="/wp-content/uploads/2018/05/word-image-3571.png" class="wp-image-4028" srcset="/wp-content/uploads/2018/05/word-image-3571.png 1232w, /wp-content/uploads/2018/05/word-image-3571-300x81.png 300w, /wp-content/uploads/2018/05/word-image-3571-768x207.png 768w, /wp-content/uploads/2018/05/word-image-3571-1024x276.png 1024w" sizes="(max-width: 1232px) 100vw, 1232px" /></p>
<h3>2.2.3、创建虚拟主机</h3>
<p>
  ①修改Apache的虚拟主机配置文件
</p>
<p><img loading="lazy" decoding="async" width="934" height="516" src="/wp-content/uploads/2018/05/word-image-3572.png" class="wp-image-4029" srcset="/wp-content/uploads/2018/05/word-image-3572.png 934w, /wp-content/uploads/2018/05/word-image-3572-300x166.png 300w, /wp-content/uploads/2018/05/word-image-3572-768x424.png 768w" sizes="(max-width: 934px) 100vw, 934px" /></p>
<p>
  ②修改本机的hosts文件
</p>
<p><img loading="lazy" decoding="async" width="800" height="444" src="/wp-content/uploads/2018/05/word-image-3573.png" class="wp-image-4030" srcset="/wp-content/uploads/2018/05/word-image-3573.png 800w, /wp-content/uploads/2018/05/word-image-3573-300x167.png 300w, /wp-content/uploads/2018/05/word-image-3573-768x426.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p>
  ③重启Apache访问测试
</p>
<p><img loading="lazy" decoding="async" width="881" height="297" src="/wp-content/uploads/2018/05/word-image-3574.png" class="wp-image-4031" srcset="/wp-content/uploads/2018/05/word-image-3574.png 881w, /wp-content/uploads/2018/05/word-image-3574-300x101.png 300w, /wp-content/uploads/2018/05/word-image-3574-768x259.png 768w" sizes="(max-width: 881px) 100vw, 881px" /></p>
<h3>2.2.4、创建应用</h3>
<p>
  ①编写入口文件
</p>
<p><img loading="lazy" decoding="async" width="1188" height="451" src="/wp-content/uploads/2018/05/word-image-3575.png" class="wp-image-4032" srcset="/wp-content/uploads/2018/05/word-image-3575.png 1188w, /wp-content/uploads/2018/05/word-image-3575-300x114.png 300w, /wp-content/uploads/2018/05/word-image-3575-768x292.png 768w, /wp-content/uploads/2018/05/word-image-3575-1024x389.png 1024w" sizes="(max-width: 1188px) 100vw, 1188px" /></p>
<p>
  ②访问测试
</p>
<p><img loading="lazy" decoding="async" width="998" height="465" src="/wp-content/uploads/2018/05/word-image-3576.png" class="wp-image-4033" srcset="/wp-content/uploads/2018/05/word-image-3576.png 998w, /wp-content/uploads/2018/05/word-image-3576-300x140.png 300w, /wp-content/uploads/2018/05/word-image-3576-768x358.png 768w" sizes="(max-width: 998px) 100vw, 998px" /></p>
<p>
  ③查看效果
</p>
<p><img loading="lazy" decoding="async" width="336" height="365" src="/wp-content/uploads/2018/05/word-image-3577.png" class="wp-image-4034" srcset="/wp-content/uploads/2018/05/word-image-3577.png 336w, /wp-content/uploads/2018/05/word-image-3577-276x300.png 276w" sizes="(max-width: 336px) 100vw, 336px" /></p>
<p>
  ④解释应用中的目录
</p>
<p><img loading="lazy" decoding="async" width="1057" height="362" src="/wp-content/uploads/2018/05/word-image-3578.png" class="wp-image-4035" srcset="/wp-content/uploads/2018/05/word-image-3578.png 1057w, /wp-content/uploads/2018/05/word-image-3578-300x103.png 300w, /wp-content/uploads/2018/05/word-image-3578-768x263.png 768w, /wp-content/uploads/2018/05/word-image-3578-1024x351.png 1024w" sizes="(max-width: 1057px) 100vw, 1057px" /></p>
<p>
  ⑤进入Home解释目录<br />
  
</p>
<p><img loading="lazy" decoding="async" width="883" height="299" src="/wp-content/uploads/2018/05/word-image-3579.png" class="wp-image-4036" srcset="/wp-content/uploads/2018/05/word-image-3579.png 883w, /wp-content/uploads/2018/05/word-image-3579-300x102.png 300w, /wp-content/uploads/2018/05/word-image-3579-768x260.png 768w" sizes="(max-width: 883px) 100vw, 883px" /></p>
<p>
  优化小技巧：
</p>
<ol>
<li>
  解决自己项目中的死链接。如果死链接比较多。会影响到项目的加载速度
</li>
</ol>
<p>
  2、更换磁盘为固态
</p>
<ol>
<li>
  磁盘冗余阵列。买raid卡挂载多块磁盘
</li>
</ol>
<h1>控制器及URL模式</h1>
<h2>3.1、创建控制器</h2>
<h3>3.1.1、控制器的存储方式</h3>
<ol>
<li>
  存储地址
</li>
</ol>
<p>
  应用(application)/模块(Home)/Controller
</p>
<ol>
<li>
  文件命名
</li>
</ol>
<p>
  控制器名称(满足驼峰式规范)+Controller+.class.php
</p>
<h3>3.1.2、控制器的创建规则</h3>
<ol>
<li>
  申明命名空间(按照目录地址规则)
</li>
<li>
  引入TP的控制器的基类
</li>
<li>
  编写自定义的控制器的类
</li>
</ol>
<h3>3.1.3、具体创建控制器</h3>
<p><img loading="lazy" decoding="async" width="1248" height="696" src="/wp-content/uploads/2018/05/word-image-3580.png" class="wp-image-4037" srcset="/wp-content/uploads/2018/05/word-image-3580.png 1248w, /wp-content/uploads/2018/05/word-image-3580-300x167.png 300w, /wp-content/uploads/2018/05/word-image-3580-768x428.png 768w, /wp-content/uploads/2018/05/word-image-3580-1024x571.png 1024w" sizes="(max-width: 1248px) 100vw, 1248px" /></p>
<h2>3.2、URL地址解析</h2>
<p>
  默认情况下TP访问的完整地址：<a href="/goto/hd8t" rel="nofollow">http://域名/入口文件?m=模块名称&amp;c=控制器名称&amp;a=方法名称(操作)</a>
</p>
<p>
  ①在控制器中增加方法
</p>
<p><img loading="lazy" decoding="async" width="1163" height="563" src="/wp-content/uploads/2018/05/word-image-3581.png" class="wp-image-4038" srcset="/wp-content/uploads/2018/05/word-image-3581.png 1163w, /wp-content/uploads/2018/05/word-image-3581-300x145.png 300w, /wp-content/uploads/2018/05/word-image-3581-768x372.png 768w, /wp-content/uploads/2018/05/word-image-3581-1024x496.png 1024w" sizes="(max-width: 1163px) 100vw, 1163px" /></p>
<p>
  ②访问测试
</p>
<p><img loading="lazy" decoding="async" width="862" height="277" src="/wp-content/uploads/2018/05/word-image-3582.png" class="wp-image-4039" srcset="/wp-content/uploads/2018/05/word-image-3582.png 862w, /wp-content/uploads/2018/05/word-image-3582-300x96.png 300w, /wp-content/uploads/2018/05/word-image-3582-768x247.png 768w" sizes="(max-width: 862px) 100vw, 862px" /></p>
<h2>3.3、默认访问(理解)</h2>
<h3>3.3.1、分析默认访问的情况</h3>
<p><img loading="lazy" decoding="async" width="1011" height="481" src="/wp-content/uploads/2018/05/word-image-3583.png" class="wp-image-4040" srcset="/wp-content/uploads/2018/05/word-image-3583.png 1011w, /wp-content/uploads/2018/05/word-image-3583-300x143.png 300w, /wp-content/uploads/2018/05/word-image-3583-768x365.png 768w" sizes="(max-width: 1011px) 100vw, 1011px" /></p>
<p>
  对于上述直接访问首先Apache的默认访问页为index.php因此就进入到项目的入口文件。由于TP默认的配置项设置默认的模块为Home默认的控制器为Index默认的方法为index因此可以看到上述效果
</p>
<h3>3.3.2、修改默认访问</h3>
<p>
  ①查看TP中的默认配置项
</p>
<p><img loading="lazy" decoding="async" width="1018" height="410" src="/wp-content/uploads/2018/05/word-image-3584.png" class="wp-image-4041" srcset="/wp-content/uploads/2018/05/word-image-3584.png 1018w, /wp-content/uploads/2018/05/word-image-3584-300x121.png 300w, /wp-content/uploads/2018/05/word-image-3584-768x309.png 768w" sizes="(max-width: 1018px) 100vw, 1018px" /></p>
<p>
  ②修改配置项
</p>
<p><img loading="lazy" decoding="async" width="1024" height="385" src="/wp-content/uploads/2018/05/word-image-3585.png" class="wp-image-4042" srcset="/wp-content/uploads/2018/05/word-image-3585.png 1024w, /wp-content/uploads/2018/05/word-image-3585-300x113.png 300w, /wp-content/uploads/2018/05/word-image-3585-768x289.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>
  ③删除缓存文件
</p>
<p><img loading="lazy" decoding="async" width="843" height="267" src="/wp-content/uploads/2018/05/word-image-3586.png" class="wp-image-4043" srcset="/wp-content/uploads/2018/05/word-image-3586.png 843w, /wp-content/uploads/2018/05/word-image-3586-300x95.png 300w, /wp-content/uploads/2018/05/word-image-3586-768x243.png 768w" sizes="(max-width: 843px) 100vw, 843px" /></p>
<p>
  ④查看效果如下
</p>
<p><img loading="lazy" decoding="async" width="866" height="349" src="/wp-content/uploads/2018/05/word-image-3587.png" class="wp-image-4044" srcset="/wp-content/uploads/2018/05/word-image-3587.png 866w, /wp-content/uploads/2018/05/word-image-3587-300x121.png 300w, /wp-content/uploads/2018/05/word-image-3587-768x310.png 768w" sizes="(max-width: 866px) 100vw, 866px" /></p>
<p>
  此时产生报错的原因是因为默认的方法不存在
</p>
<h2>3.4、调试模式</h2>
<p>
  通过定义一个常量操作TP所处的模式。调试默认每次都会自动的加载最新的配置文件以及公共函数。跟调试模式对应的叫做生产模式
</p>
<p>
  在实际开发的过程中开启调试模式。当项目上线运行的过程中需要使用生产模式。在生成模式下会缓存(临时存储信息)对于的文件信息也会减少日志文件的生成
</p>
<p>
  ①开启调试模式
</p>
<p><img loading="lazy" decoding="async" width="976" height="522" src="/wp-content/uploads/2018/05/word-image-3588.png" class="wp-image-4045" srcset="/wp-content/uploads/2018/05/word-image-3588.png 976w, /wp-content/uploads/2018/05/word-image-3588-300x160.png 300w, /wp-content/uploads/2018/05/word-image-3588-768x411.png 768w" sizes="(max-width: 976px) 100vw, 976px" /></p>
<p>
  ②查看访问效果
</p>
<p><img loading="lazy" decoding="async" width="1277" height="567" src="/wp-content/uploads/2018/05/word-image-3589.png" class="wp-image-4046" srcset="/wp-content/uploads/2018/05/word-image-3589.png 1277w, /wp-content/uploads/2018/05/word-image-3589-300x133.png 300w, /wp-content/uploads/2018/05/word-image-3589-768x341.png 768w, /wp-content/uploads/2018/05/word-image-3589-1024x455.png 1024w" sizes="(max-width: 1277px) 100vw, 1277px" /></p>
<p>
  ③查看runtime下的目录
</p>
<p><img loading="lazy" decoding="async" width="896" height="364" src="/wp-content/uploads/2018/05/word-image-3590.png" class="wp-image-4047" srcset="/wp-content/uploads/2018/05/word-image-3590.png 896w, /wp-content/uploads/2018/05/word-image-3590-300x122.png 300w, /wp-content/uploads/2018/05/word-image-3590-768x312.png 768w" sizes="(max-width: 896px) 100vw, 896px" /></p>
<h2>3.5、TP中的模块</h2>
<p>
  在TP中的应用目录下每一个文件就是一个模块只是Common跟Runtime比较特殊。不能参与项目中其他”访问功能业务”。想要增加模块可以直接在应用目录下去增加目录即可
</p>
<p>
  例如如下增加后台模块
</p>
<p>
  ①创建目录
</p>
<p><img loading="lazy" decoding="async" width="912" height="241" src="/wp-content/uploads/2018/05/word-image-3591.png" class="wp-image-4048" srcset="/wp-content/uploads/2018/05/word-image-3591.png 912w, /wp-content/uploads/2018/05/word-image-3591-300x79.png 300w, /wp-content/uploads/2018/05/word-image-3591-768x203.png 768w" sizes="(max-width: 912px) 100vw, 912px" /></p>
<p>
  ②创建控制器
</p>
<p><img loading="lazy" decoding="async" width="1022" height="659" src="/wp-content/uploads/2018/05/word-image-3592.png" class="wp-image-4049" srcset="/wp-content/uploads/2018/05/word-image-3592.png 1022w, /wp-content/uploads/2018/05/word-image-3592-300x193.png 300w, /wp-content/uploads/2018/05/word-image-3592-768x495.png 768w" sizes="(max-width: 1022px) 100vw, 1022px" /></p>
<p>
  ③访问测试
</p>
<p><img loading="lazy" decoding="async" width="682" height="226" src="/wp-content/uploads/2018/05/word-image-3593.png" class="wp-image-4050" srcset="/wp-content/uploads/2018/05/word-image-3593.png 682w, /wp-content/uploads/2018/05/word-image-3593-300x99.png 300w" sizes="(max-width: 682px) 100vw, 682px" /></p>
<h2>3.6、TP中的配置文件</h2>
<h3>3.6.1、配置文件地址</h3>
<ol>
<li>
  Tp框架中惯例配置文件(ThinkPHP\Conf\convention.php)
</li>
<li>
  公共模块的配置文件(Application\Common\Conf\config.php)
</li>
<li>
  某一个模块的配置文件(Application\模块\Conf\config.php)
</li>
</ol>
<p>
  对于配置文件TP是自动载入的。因此可以在项目中直接使用配置文件
</p>
<h3>3.6.2、TP中配置文件的优先级</h3>
<p>
  配置文件优先级含义：当同一个配置项在三个文件中同时出现最终使用哪一个配置文件中的内容
</p>
<p>
  模块配置文件&gt;公共模块配置文件&gt;TP惯例配置文件
</p>
<h3>3.6.3、演示配置文件优先级</h3>
<p>
  ①修改公共模块的配置文件
</p>
<p><img loading="lazy" decoding="async" width="1279" height="336" src="/wp-content/uploads/2018/05/word-image-3594.png" class="wp-image-4051" srcset="/wp-content/uploads/2018/05/word-image-3594.png 1279w, /wp-content/uploads/2018/05/word-image-3594-300x79.png 300w, /wp-content/uploads/2018/05/word-image-3594-768x202.png 768w, /wp-content/uploads/2018/05/word-image-3594-1024x269.png 1024w" sizes="(max-width: 1279px) 100vw, 1279px" /></p>
<p>
  ②修改Home模块下的配置
</p>
<p><img loading="lazy" decoding="async" width="970" height="343" src="/wp-content/uploads/2018/05/word-image-3595.png" class="wp-image-4052" srcset="/wp-content/uploads/2018/05/word-image-3595.png 970w, /wp-content/uploads/2018/05/word-image-3595-300x106.png 300w, /wp-content/uploads/2018/05/word-image-3595-768x272.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></p>
<p>
  ③增加测试方法
</p>
<p><img loading="lazy" decoding="async" width="913" height="452" src="/wp-content/uploads/2018/05/word-image-3596.png" class="wp-image-4053" srcset="/wp-content/uploads/2018/05/word-image-3596.png 913w, /wp-content/uploads/2018/05/word-image-3596-300x149.png 300w, /wp-content/uploads/2018/05/word-image-3596-768x380.png 768w" sizes="(max-width: 913px) 100vw, 913px" /></p>
<p>
  ④查看效果
</p>
<p><img loading="lazy" decoding="async" width="565" height="251" src="/wp-content/uploads/2018/05/word-image-3597.png" class="wp-image-4054" srcset="/wp-content/uploads/2018/05/word-image-3597.png 565w, /wp-content/uploads/2018/05/word-image-3597-300x133.png 300w" sizes="(max-width: 565px) 100vw, 565px" /></p>
<h2>3.7、TP中的四种URL模式（重点）</h2>
<h3>3.7.1、四种URL模式介绍</h3>
<p>
  ①普通模式
</p>
<p>
  直接通过给入口文件传递m、c、a三个参数
</p>
<p>
  m对应模块名称
</p>
<p>
  c对应控制器名称
</p>
<p>
  a对应方法名称
</p>
<p>
  格式：<a href="/goto/zx7y" rel="nofollow">http://tp.com/index.php?m=Home&amp;c=Index&amp;a=test2</a>
</p>
<p>
  任何情况下都可以访问
</p>
<p>
  ②pathinfo模式
</p>
<p>
  Pathinfo模式从URL地址栏上看上去像一个目录的格式。
</p>
<p>
  格式为：<a href="/goto/itit" rel="nofollow">http://tp.com/index.php/Home/Index/test2</a>
</p>
<p>
  对于上述的地址格式入口文件后的每一个“/”分隔的就是一个参数
</p>
<p>
  Home(第一个参数)对应的模块名称
</p>
<p>
  Index(第二个参数)对应的控制器名称
</p>
<p>
  Test2(第三个参数)对应的方法名称
</p>
<p>
  注意：pathinfo模式需要有web服务器的支持 Apache支持此模式。Nginx就不支持
</p>
<p>
  ③重写模式
</p>
<p>
  将原本的URL访问改写成其他的URL形式。重写模式根据不同的web服务器决定。最常见的重写就是隐藏项目的入口文件
</p>
<p>
  例如
</p>
<p>
  访问:http://tp.com/Home/Index/test2=&gt;解析的地址为http://tp.com、index.php/Home/Index/test2
</p>
<p>
  ④兼容模式
</p>
<p>
  考虑部分web服务器不支持pathinfo。又想要去使用类似pathinfo的格式。就可以使用兼容模式
</p>
<p>
  格式：<a href="/goto/dc8y" rel="nofollow">http://tp.com/index.php?s=/Home/Index/test2</a>
</p>
<p>
  兼容模式没有任何其他的外界要求
</p>
<h3>3.7.2、实现隐藏入口文件</h3>
<p>
  ①开启Apache的重写模块
</p>
<p><img loading="lazy" decoding="async" width="1012" height="473" src="/wp-content/uploads/2018/05/word-image-3598.png" class="wp-image-4055" srcset="/wp-content/uploads/2018/05/word-image-3598.png 1012w, /wp-content/uploads/2018/05/word-image-3598-300x140.png 300w, /wp-content/uploads/2018/05/word-image-3598-768x359.png 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></p>
<p>
  ②设置虚拟主机可以重写
</p>
<p><img loading="lazy" decoding="async" width="1126" height="545" src="/wp-content/uploads/2018/05/word-image-3599.png" class="wp-image-4056" srcset="/wp-content/uploads/2018/05/word-image-3599.png 1126w, /wp-content/uploads/2018/05/word-image-3599-300x145.png 300w, /wp-content/uploads/2018/05/word-image-3599-768x372.png 768w, /wp-content/uploads/2018/05/word-image-3599-1024x496.png 1024w" sizes="(max-width: 1126px) 100vw, 1126px" /></p>
<p>
  ③拷贝重写规则文件
</p>
<p><img loading="lazy" decoding="async" width="1172" height="491" src="/wp-content/uploads/2018/05/word-image-3600.png" class="wp-image-4057" srcset="/wp-content/uploads/2018/05/word-image-3600.png 1172w, /wp-content/uploads/2018/05/word-image-3600-300x126.png 300w, /wp-content/uploads/2018/05/word-image-3600-768x322.png 768w, /wp-content/uploads/2018/05/word-image-3600-1024x429.png 1024w" sizes="(max-width: 1172px) 100vw, 1172px" /></p>
<p>
  ④重启Apache查看效果
</p>
<p><img loading="lazy" decoding="async" width="544" height="125" src="/wp-content/uploads/2018/05/word-image-3601.png" class="wp-image-4058" srcset="/wp-content/uploads/2018/05/word-image-3601.png 544w, /wp-content/uploads/2018/05/word-image-3601-300x69.png 300w" sizes="(max-width: 544px) 100vw, 544px" /></p>
<p>
  注意：只要条件满足TP中的四种URL模式都可以使用访问到方法
</p>
<h3>3.7.3、URL地址生成(重点会用)</h3>
<p>
  使用TP提供的U函数根据当前的模型、控制器、方法、参数等生产一个链接地址
</p>
<p>
  ①查看U函数的使用方式
</p>
<p><img loading="lazy" decoding="async" width="1157" height="639" src="/wp-content/uploads/2018/05/word-image-3602.png" class="wp-image-4059" srcset="/wp-content/uploads/2018/05/word-image-3602.png 1157w, /wp-content/uploads/2018/05/word-image-3602-300x166.png 300w, /wp-content/uploads/2018/05/word-image-3602-768x424.png 768w, /wp-content/uploads/2018/05/word-image-3602-1024x566.png 1024w" sizes="(max-width: 1157px) 100vw, 1157px" /></p>
<p>
  ②编写测试代码
</p>
<p><img loading="lazy" decoding="async" width="1097" height="695" src="/wp-content/uploads/2018/05/word-image-3603.png" class="wp-image-4060" srcset="/wp-content/uploads/2018/05/word-image-3603.png 1097w, /wp-content/uploads/2018/05/word-image-3603-300x190.png 300w, /wp-content/uploads/2018/05/word-image-3603-768x487.png 768w, /wp-content/uploads/2018/05/word-image-3603-1024x649.png 1024w" sizes="(max-width: 1097px) 100vw, 1097px" /></p>
<p>
  ④查看效果
</p>
<p><img loading="lazy" decoding="async" width="964" height="449" src="/wp-content/uploads/2018/05/word-image-3604.png" class="wp-image-4061" srcset="/wp-content/uploads/2018/05/word-image-3604.png 964w, /wp-content/uploads/2018/05/word-image-3604-300x140.png 300w, /wp-content/uploads/2018/05/word-image-3604-768x358.png 768w" sizes="(max-width: 964px) 100vw, 964px" /></p>
<p>
  从上述结果中可以得知TP默认的是使用pathinfo模式
</p>
<p>
  在TP的配置文件中有一个URL_MODEL控制使用的URL模式
</p>
<p>
  ⑤查看惯例配置中的配置项
</p>
<p><img loading="lazy" decoding="async" width="1149" height="440" src="/wp-content/uploads/2018/05/word-image-3605.png" class="wp-image-4062" srcset="/wp-content/uploads/2018/05/word-image-3605.png 1149w, /wp-content/uploads/2018/05/word-image-3605-300x115.png 300w, /wp-content/uploads/2018/05/word-image-3605-768x294.png 768w, /wp-content/uploads/2018/05/word-image-3605-1024x392.png 1024w" sizes="(max-width: 1149px) 100vw, 1149px" /></p>
<p>
  ⑥查看普通模式的地址
</p>
<p>
  修改URL模式
</p>
<p><img loading="lazy" decoding="async" width="862" height="389" src="/wp-content/uploads/2018/05/word-image-3606.png" class="wp-image-4063" srcset="/wp-content/uploads/2018/05/word-image-3606.png 862w, /wp-content/uploads/2018/05/word-image-3606-300x135.png 300w, /wp-content/uploads/2018/05/word-image-3606-768x347.png 768w" sizes="(max-width: 862px) 100vw, 862px" /></p>
<p>
  效果如下
</p>
<p><img loading="lazy" decoding="async" width="864" height="347" src="/wp-content/uploads/2018/05/word-image-3607.png" class="wp-image-4064" srcset="/wp-content/uploads/2018/05/word-image-3607.png 864w, /wp-content/uploads/2018/05/word-image-3607-300x120.png 300w, /wp-content/uploads/2018/05/word-image-3607-768x308.png 768w" sizes="(max-width: 864px) 100vw, 864px" /></p>
<p>
  ⑦查看重写模式地址
</p>
<p><img loading="lazy" decoding="async" width="1102" height="447" src="/wp-content/uploads/2018/05/word-image-3608.png" class="wp-image-4065" srcset="/wp-content/uploads/2018/05/word-image-3608.png 1102w, /wp-content/uploads/2018/05/word-image-3608-300x122.png 300w, /wp-content/uploads/2018/05/word-image-3608-768x312.png 768w, /wp-content/uploads/2018/05/word-image-3608-1024x415.png 1024w" sizes="(max-width: 1102px) 100vw, 1102px" /></p>
<p>
  结果如下
</p>
<p><img loading="lazy" decoding="async" width="786" height="339" src="/wp-content/uploads/2018/05/word-image-3609.png" class="wp-image-4066" srcset="/wp-content/uploads/2018/05/word-image-3609.png 786w, /wp-content/uploads/2018/05/word-image-3609-300x129.png 300w, /wp-content/uploads/2018/05/word-image-3609-768x331.png 768w" sizes="(max-width: 786px) 100vw, 786px" /></p>
<p>
  ⑧查看兼容模式
</p>
<p><img loading="lazy" decoding="async" width="1063" height="379" src="/wp-content/uploads/2018/05/word-image-3610.png" class="wp-image-4067" srcset="/wp-content/uploads/2018/05/word-image-3610.png 1063w, /wp-content/uploads/2018/05/word-image-3610-300x107.png 300w, /wp-content/uploads/2018/05/word-image-3610-768x274.png 768w, /wp-content/uploads/2018/05/word-image-3610-1024x365.png 1024w" sizes="(max-width: 1063px) 100vw, 1063px" /><br />
<img loading="lazy" decoding="async" width="804" height="375" src="/wp-content/uploads/2018/05/word-image-3611.png" class="wp-image-4068" srcset="/wp-content/uploads/2018/05/word-image-3611.png 804w, /wp-content/uploads/2018/05/word-image-3611-300x140.png 300w, /wp-content/uploads/2018/05/word-image-3611-768x358.png 768w" sizes="(max-width: 804px) 100vw, 804px" /></p>
<p>
  注意：TP中的四种URL模式并不是限制项目需要使用哪一种模式进行访问。URL_MODEL配置项的作用是为了控制U函数所生成的URL地址的格式
</p>
<h2>3.8、页面跳转与重定向</h2>
<p>
  关于页面跳转跟重定向功能是经常使用。常见位置在数据操作完成之后的提示信息
</p>
<h3>3.8.1、页面跳转</h3>
<p>
  在TP的控制器基类中提供了两个方法可以实现跳转功能分别为success跟error
</p>
<p>
  ①查看源码位置
</p>
<p><img loading="lazy" decoding="async" width="1087" height="695" src="/wp-content/uploads/2018/05/word-image-3612.png" class="wp-image-4069" srcset="/wp-content/uploads/2018/05/word-image-3612.png 1087w, /wp-content/uploads/2018/05/word-image-3612-300x192.png 300w, /wp-content/uploads/2018/05/word-image-3612-768x491.png 768w, /wp-content/uploads/2018/05/word-image-3612-1024x655.png 1024w" sizes="(max-width: 1087px) 100vw, 1087px" /></p>
<p>
  ②测试成功的方法使用
</p>
<p><img loading="lazy" decoding="async" width="1029" height="505" src="/wp-content/uploads/2018/05/word-image-3613.png" class="wp-image-4070" srcset="/wp-content/uploads/2018/05/word-image-3613.png 1029w, /wp-content/uploads/2018/05/word-image-3613-300x147.png 300w, /wp-content/uploads/2018/05/word-image-3613-768x377.png 768w, /wp-content/uploads/2018/05/word-image-3613-1024x503.png 1024w" sizes="(max-width: 1029px) 100vw, 1029px" /></p>
<p>
  ③测试失败的方法的使用
</p>
<p><img loading="lazy" decoding="async" width="1017" height="482" src="/wp-content/uploads/2018/05/word-image-3614.png" class="wp-image-4071" srcset="/wp-content/uploads/2018/05/word-image-3614.png 1017w, /wp-content/uploads/2018/05/word-image-3614-300x142.png 300w, /wp-content/uploads/2018/05/word-image-3614-768x364.png 768w" sizes="(max-width: 1017px) 100vw, 1017px" /></p>
<p>
  ④关于成功失败跳转的模板文件地址
</p>
<p><img loading="lazy" decoding="async" width="1289" height="643" src="/wp-content/uploads/2018/05/word-image-3615.png" class="wp-image-4072" srcset="/wp-content/uploads/2018/05/word-image-3615.png 1289w, /wp-content/uploads/2018/05/word-image-3615-300x150.png 300w, /wp-content/uploads/2018/05/word-image-3615-768x383.png 768w, /wp-content/uploads/2018/05/word-image-3615-1024x511.png 1024w" sizes="(max-width: 1289px) 100vw, 1289px" /></p>
<h3>3.8.2、页面重定向</h3>
<p>
  ①查看使用方式
</p>
<p><img loading="lazy" decoding="async" width="1098" height="682" src="/wp-content/uploads/2018/05/word-image-3616.png" class="wp-image-4073" srcset="/wp-content/uploads/2018/05/word-image-3616.png 1098w, /wp-content/uploads/2018/05/word-image-3616-300x186.png 300w, /wp-content/uploads/2018/05/word-image-3616-768x477.png 768w, /wp-content/uploads/2018/05/word-image-3616-1024x636.png 1024w" sizes="(max-width: 1098px) 100vw, 1098px" /></p>
<p>
  ②创建方法测试
</p>
<p><img loading="lazy" decoding="async" width="1095" height="545" src="/wp-content/uploads/2018/05/word-image-3617.png" class="wp-image-4074" srcset="/wp-content/uploads/2018/05/word-image-3617.png 1095w, /wp-content/uploads/2018/05/word-image-3617-300x149.png 300w, /wp-content/uploads/2018/05/word-image-3617-768x382.png 768w, /wp-content/uploads/2018/05/word-image-3617-1024x510.png 1024w" sizes="(max-width: 1095px) 100vw, 1095px" /></p>
<p>
  ③查看效果
</p>
<p><img loading="lazy" decoding="async" width="679" height="241" src="/wp-content/uploads/2018/05/word-image-3618.png" class="wp-image-4075" srcset="/wp-content/uploads/2018/05/word-image-3618.png 679w, /wp-content/uploads/2018/05/word-image-3618-300x106.png 300w" sizes="(max-width: 679px) 100vw, 679px" /></p>
<h2>3.9、空控制器与空操作</h2>
<h3>3.9.1、空操作</h3>
<p>
  当用户访问某一个不存在的方法时接下来由单独的一个空操作(对应在控制中的_empty的方法)实现处理请求。
</p>
<p>
  ①增加方法
</p>
<p><img loading="lazy" decoding="async" width="839" height="468" src="/wp-content/uploads/2018/05/word-image-3619.png" class="wp-image-4076" srcset="/wp-content/uploads/2018/05/word-image-3619.png 839w, /wp-content/uploads/2018/05/word-image-3619-300x167.png 300w, /wp-content/uploads/2018/05/word-image-3619-768x428.png 768w" sizes="(max-width: 839px) 100vw, 839px" /></p>
<p>
  ②访问测试
</p>
<p><img loading="lazy" decoding="async" width="1032" height="363" src="/wp-content/uploads/2018/05/word-image-3620.png" class="wp-image-4077" srcset="/wp-content/uploads/2018/05/word-image-3620.png 1032w, /wp-content/uploads/2018/05/word-image-3620-300x106.png 300w, /wp-content/uploads/2018/05/word-image-3620-768x270.png 768w, /wp-content/uploads/2018/05/word-image-3620-1024x360.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
<h3>3.9.2、空控制器</h3>
<p>
  当用户访问一个不存在的控制器时会自动的去执行空控制下对应的方法。
</p>
<p>
  ①先创建空控制器
</p>
<p><img loading="lazy" decoding="async" width="858" height="481" src="/wp-content/uploads/2018/05/word-image-3621.png" class="wp-image-4078" srcset="/wp-content/uploads/2018/05/word-image-3621.png 858w, /wp-content/uploads/2018/05/word-image-3621-300x168.png 300w, /wp-content/uploads/2018/05/word-image-3621-768x431.png 768w" sizes="(max-width: 858px) 100vw, 858px" /></p>
<p>
  ②执行查看效果
</p>
<p><img loading="lazy" decoding="async" width="1094" height="461" src="/wp-content/uploads/2018/05/word-image-3622.png" class="wp-image-4079" srcset="/wp-content/uploads/2018/05/word-image-3622.png 1094w, /wp-content/uploads/2018/05/word-image-3622-300x126.png 300w, /wp-content/uploads/2018/05/word-image-3622-768x324.png 768w, /wp-content/uploads/2018/05/word-image-3622-1024x432.png 1024w" sizes="(max-width: 1094px) 100vw, 1094px" /></p>
<p>
  ③在空控制器中创建空方法
</p>
<p><img loading="lazy" decoding="async" width="936" height="648" src="/wp-content/uploads/2018/05/word-image-3623.png" class="wp-image-4080" srcset="/wp-content/uploads/2018/05/word-image-3623.png 936w, /wp-content/uploads/2018/05/word-image-3623-300x208.png 300w, /wp-content/uploads/2018/05/word-image-3623-768x532.png 768w" sizes="(max-width: 936px) 100vw, 936px" /></p>
<p>
  效果如下
</p>
<p><img loading="lazy" decoding="async" width="694" height="184" src="/wp-content/uploads/2018/05/word-image-3624.png" class="wp-image-4081" srcset="/wp-content/uploads/2018/05/word-image-3624.png 694w, /wp-content/uploads/2018/05/word-image-3624-300x80.png 300w" sizes="(max-width: 694px) 100vw, 694px" /></p>
<p>
  备注：最好事先错误的提示页面通过使用web服务器的错误提示设置
</p>
<h1>视图(一)</h1>
<h2>4.1、视图创建规则</h2>
<h3>4.1.1、视图创建规则</h3>
<ol>
<li>
  默认情况下需要将视图的模板文件存储在模块下的view目录中
</li>
<li>
  默认情况下视图存储需要在View下跟控制器同名的目录中
</li>
<li>
  默认情况下视图模板文件名称需要保持跟方法同名后缀为.html的模板
</li>
</ol>
<h3>4.1.2、创建视图</h3>
<p>
  ①创建根控制器同名的目录
</p>
<p><img loading="lazy" decoding="async" width="997" height="187" src="/wp-content/uploads/2018/05/word-image-3625.png" class="wp-image-4082" srcset="/wp-content/uploads/2018/05/word-image-3625.png 997w, /wp-content/uploads/2018/05/word-image-3625-300x56.png 300w, /wp-content/uploads/2018/05/word-image-3625-768x144.png 768w" sizes="(max-width: 997px) 100vw, 997px" /></p>
<p>
  ②创建模板
</p>
<p><img loading="lazy" decoding="async" width="918" height="476" src="/wp-content/uploads/2018/05/word-image-3626.png" class="wp-image-4083" srcset="/wp-content/uploads/2018/05/word-image-3626.png 918w, /wp-content/uploads/2018/05/word-image-3626-300x156.png 300w, /wp-content/uploads/2018/05/word-image-3626-768x398.png 768w" sizes="(max-width: 918px) 100vw, 918px" /></p>
<h2>4.2、控制器调用视图</h2>
<p>
  对于在TP的方法中需要使用视图的模板可以使用两个方法分别为display跟fetch方法。
</p>
<p>
  对于display跟fetch用法一模一样，区别在于display会直接输出模板的结果。Fetch不会直接输出
</p>
<h3>4.2.1、演示display跟fetch的区别</h3>
<p>
  ①创建方法
</p>
<p><img loading="lazy" decoding="async" width="1061" height="596" src="/wp-content/uploads/2018/05/word-image-3627.png" class="wp-image-4084" srcset="/wp-content/uploads/2018/05/word-image-3627.png 1061w, /wp-content/uploads/2018/05/word-image-3627-300x169.png 300w, /wp-content/uploads/2018/05/word-image-3627-768x431.png 768w, /wp-content/uploads/2018/05/word-image-3627-1024x575.png 1024w" sizes="(max-width: 1061px) 100vw, 1061px" /></p>
<p>
  ②查看效果
</p>
<p><img loading="lazy" decoding="async" width="764" height="167" src="/wp-content/uploads/2018/05/word-image-3628.png" class="wp-image-4085" srcset="/wp-content/uploads/2018/05/word-image-3628.png 764w, /wp-content/uploads/2018/05/word-image-3628-300x66.png 300w" sizes="(max-width: 764px) 100vw, 764px" /><br />
<img loading="lazy" decoding="async" width="708" height="259" src="/wp-content/uploads/2018/05/word-image-3629.png" class="wp-image-4086" srcset="/wp-content/uploads/2018/05/word-image-3629.png 708w, /wp-content/uploads/2018/05/word-image-3629-300x110.png 300w" sizes="(max-width: 708px) 100vw, 708px" /></p>
<p>
  修改showtwo方法
</p>
<p><img loading="lazy" decoding="async" width="946" height="587" src="/wp-content/uploads/2018/05/word-image-3630.png" class="wp-image-4087" srcset="/wp-content/uploads/2018/05/word-image-3630.png 946w, /wp-content/uploads/2018/05/word-image-3630-300x186.png 300w, /wp-content/uploads/2018/05/word-image-3630-768x477.png 768w" sizes="(max-width: 946px) 100vw, 946px" /></p>
<p>
  结果如下
</p>
<p><img loading="lazy" decoding="async" width="740" height="323" src="/wp-content/uploads/2018/05/word-image-3631.png" class="wp-image-4088" srcset="/wp-content/uploads/2018/05/word-image-3631.png 740w, /wp-content/uploads/2018/05/word-image-3631-300x131.png 300w" sizes="(max-width: 740px) 100vw, 740px" /></p>
<h3>4.2.2、演示display用法</h3>
<p>
  ①查看使用方式
</p>
<p><img loading="lazy" decoding="async" width="848" height="390" src="/wp-content/uploads/2018/05/word-image-3632.png" class="wp-image-4089" srcset="/wp-content/uploads/2018/05/word-image-3632.png 848w, /wp-content/uploads/2018/05/word-image-3632-300x138.png 300w, /wp-content/uploads/2018/05/word-image-3632-768x353.png 768w" sizes="(max-width: 848px) 100vw, 848px" /></p>
<p>
  ②指定模块方式使用display
</p>
<p>
  创建测试方法
</p>
<p><img loading="lazy" decoding="async" width="898" height="626" src="/wp-content/uploads/2018/05/word-image-3633.png" class="wp-image-4090" srcset="/wp-content/uploads/2018/05/word-image-3633.png 898w, /wp-content/uploads/2018/05/word-image-3633-300x209.png 300w, /wp-content/uploads/2018/05/word-image-3633-768x535.png 768w" sizes="(max-width: 898px) 100vw, 898px" /></p>
<p>
  查看效果
</p>
<p><img loading="lazy" decoding="async" width="654" height="179" src="/wp-content/uploads/2018/05/word-image-3634.png" class="wp-image-4091" srcset="/wp-content/uploads/2018/05/word-image-3634.png 654w, /wp-content/uploads/2018/05/word-image-3634-300x82.png 300w" sizes="(max-width: 654px) 100vw, 654px" /><br />
<img loading="lazy" decoding="async" width="633" height="135" src="/wp-content/uploads/2018/05/word-image-3635.png" class="wp-image-4092" srcset="/wp-content/uploads/2018/05/word-image-3635.png 633w, /wp-content/uploads/2018/05/word-image-3635-300x64.png 300w" sizes="(max-width: 633px) 100vw, 633px" /></p>
<p>
  ③直接指定模板文件地址
</p>
<p>
  创建测试方法
</p>
<p><img loading="lazy" decoding="async" width="1058" height="373" src="/wp-content/uploads/2018/05/word-image-3636.png" class="wp-image-4093" srcset="/wp-content/uploads/2018/05/word-image-3636.png 1058w, /wp-content/uploads/2018/05/word-image-3636-300x106.png 300w, /wp-content/uploads/2018/05/word-image-3636-768x271.png 768w, /wp-content/uploads/2018/05/word-image-3636-1024x361.png 1024w" sizes="(max-width: 1058px) 100vw, 1058px" /></p>
<p>
  查看结果
</p>
<p><img loading="lazy" decoding="async" width="764" height="202" src="/wp-content/uploads/2018/05/word-image-3637.png" class="wp-image-4094" srcset="/wp-content/uploads/2018/05/word-image-3637.png 764w, /wp-content/uploads/2018/05/word-image-3637-300x79.png 300w" sizes="(max-width: 764px) 100vw, 764px" /></p>
<h2>4.3、模板替换</h2>
<p>
  模板替换就是通过在模板中使用TP内置的”模板变量”.TP在每次渲染模板之前都会讲对应的模板变量进行替换
</p>
<h3>4.3.1、内置的模板替换</h3>
<p>
  ①查看文档
</p>
<p>
  在TP有内置的模板变量替换如下
</p>
<p><img loading="lazy" decoding="async" width="885" height="277" src="/wp-content/uploads/2018/05/word-image-3638.png" class="wp-image-4095" srcset="/wp-content/uploads/2018/05/word-image-3638.png 885w, /wp-content/uploads/2018/05/word-image-3638-300x94.png 300w, /wp-content/uploads/2018/05/word-image-3638-768x240.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></p>
<p>
  ②修改show模板查看效果
</p>
<p><img loading="lazy" decoding="async" width="1080" height="675" src="/wp-content/uploads/2018/05/word-image-3639.png" class="wp-image-4096" srcset="/wp-content/uploads/2018/05/word-image-3639.png 1080w, /wp-content/uploads/2018/05/word-image-3639-300x188.png 300w, /wp-content/uploads/2018/05/word-image-3639-768x480.png 768w, /wp-content/uploads/2018/05/word-image-3639-1024x640.png 1024w" sizes="(max-width: 1080px) 100vw, 1080px" /></p>
<p>
  效果如下
</p>
<p><img loading="lazy" decoding="async" width="989" height="425" src="/wp-content/uploads/2018/05/word-image-3640.png" class="wp-image-4097" srcset="/wp-content/uploads/2018/05/word-image-3640.png 989w, /wp-content/uploads/2018/05/word-image-3640-300x129.png 300w, /wp-content/uploads/2018/05/word-image-3640-768x330.png 768w" sizes="(max-width: 989px) 100vw, 989px" /></p>
<p>
  最常使用的是__PUBLIC__替换资源地址
</p>
<h3>4.3.2、自定义模板替换</h3>
<p>
  ①增加自定义配置项
</p>
<p><img loading="lazy" decoding="async" width="987" height="525" src="/wp-content/uploads/2018/05/word-image-3641.png" class="wp-image-4098" srcset="/wp-content/uploads/2018/05/word-image-3641.png 987w, /wp-content/uploads/2018/05/word-image-3641-300x160.png 300w, /wp-content/uploads/2018/05/word-image-3641-768x409.png 768w" sizes="(max-width: 987px) 100vw, 987px" /></p>
<p>
  ②模板中使用
</p>
<p><img loading="lazy" decoding="async" width="1068" height="412" src="/wp-content/uploads/2018/05/word-image-3642.png" class="wp-image-4099" srcset="/wp-content/uploads/2018/05/word-image-3642.png 1068w, /wp-content/uploads/2018/05/word-image-3642-300x116.png 300w, /wp-content/uploads/2018/05/word-image-3642-768x296.png 768w, /wp-content/uploads/2018/05/word-image-3642-1024x395.png 1024w" sizes="(max-width: 1068px) 100vw, 1068px" /></p>
<p>
  ③效果如下
</p>
<p><img loading="lazy" decoding="async" width="869" height="257" src="/wp-content/uploads/2018/05/word-image-3643.png" class="wp-image-4100" srcset="/wp-content/uploads/2018/05/word-image-3643.png 869w, /wp-content/uploads/2018/05/word-image-3643-300x89.png 300w, /wp-content/uploads/2018/05/word-image-3643-768x227.png 768w" sizes="(max-width: 869px) 100vw, 869px" /></p>
<h1>案例-搭建电商项目后台</h1>
<h2>5.1、项目部署</h2>
<h3>5.1.1、创建项目</h3>
<p>
  ①创建项目的根目录
</p>
<p><img loading="lazy" decoding="async" width="987" height="294" src="/wp-content/uploads/2018/05/word-image-3644.png" class="wp-image-4101" srcset="/wp-content/uploads/2018/05/word-image-3644.png 987w, /wp-content/uploads/2018/05/word-image-3644-300x89.png 300w, /wp-content/uploads/2018/05/word-image-3644-768x229.png 768w" sizes="(max-width: 987px) 100vw, 987px" /></p>
<p>
  ②创建wwwroot目录
</p>
<p><img loading="lazy" decoding="async" width="890" height="153" src="/wp-content/uploads/2018/05/word-image-3645.png" class="wp-image-4102" srcset="/wp-content/uploads/2018/05/word-image-3645.png 890w, /wp-content/uploads/2018/05/word-image-3645-300x52.png 300w, /wp-content/uploads/2018/05/word-image-3645-768x132.png 768w" sizes="(max-width: 890px) 100vw, 890px" /></p>
<p>
  ③拷贝TP的框架源代码
</p>
<p><img loading="lazy" decoding="async" width="1159" height="358" src="/wp-content/uploads/2018/05/word-image-3646.png" class="wp-image-4103" srcset="/wp-content/uploads/2018/05/word-image-3646.png 1159w, /wp-content/uploads/2018/05/word-image-3646-300x93.png 300w, /wp-content/uploads/2018/05/word-image-3646-768x237.png 768w, /wp-content/uploads/2018/05/word-image-3646-1024x316.png 1024w" sizes="(max-width: 1159px) 100vw, 1159px" /></p>
<p>
  ④拷贝入口文件及重写规则文件
</p>
<p><img loading="lazy" decoding="async" width="1212" height="376" src="/wp-content/uploads/2018/05/word-image-3647.png" class="wp-image-4104" srcset="/wp-content/uploads/2018/05/word-image-3647.png 1212w, /wp-content/uploads/2018/05/word-image-3647-300x93.png 300w, /wp-content/uploads/2018/05/word-image-3647-768x238.png 768w, /wp-content/uploads/2018/05/word-image-3647-1024x318.png 1024w" sizes="(max-width: 1212px) 100vw, 1212px" /></p>
<h3>5.1.2、配置虚拟主机</h3>
<p>
  ①增加虚拟主机
</p>
<p><img loading="lazy" decoding="async" width="1053" height="449" src="/wp-content/uploads/2018/05/word-image-3648.png" class="wp-image-4105" srcset="/wp-content/uploads/2018/05/word-image-3648.png 1053w, /wp-content/uploads/2018/05/word-image-3648-300x128.png 300w, /wp-content/uploads/2018/05/word-image-3648-768x327.png 768w, /wp-content/uploads/2018/05/word-image-3648-1024x437.png 1024w" sizes="(max-width: 1053px) 100vw, 1053px" /></p>
<p>
  ②修改hosts文件
</p>
<p><img loading="lazy" decoding="async" width="864" height="408" src="/wp-content/uploads/2018/05/word-image-3649.png" class="wp-image-4106" srcset="/wp-content/uploads/2018/05/word-image-3649.png 864w, /wp-content/uploads/2018/05/word-image-3649-300x142.png 300w, /wp-content/uploads/2018/05/word-image-3649-768x363.png 768w" sizes="(max-width: 864px) 100vw, 864px" /></p>
<p>
  ③修改入口文件
</p>
<p><img loading="lazy" decoding="async" width="996" height="553" src="/wp-content/uploads/2018/05/word-image-3650.png" class="wp-image-4107" srcset="/wp-content/uploads/2018/05/word-image-3650.png 996w, /wp-content/uploads/2018/05/word-image-3650-300x167.png 300w, /wp-content/uploads/2018/05/word-image-3650-768x426.png 768w" sizes="(max-width: 996px) 100vw, 996px" /></p>
<p>
  ④重启Apache访问查看
</p>
<p><img loading="lazy" decoding="async" width="978" height="447" src="/wp-content/uploads/2018/05/word-image-3651.png" class="wp-image-4108" srcset="/wp-content/uploads/2018/05/word-image-3651.png 978w, /wp-content/uploads/2018/05/word-image-3651-300x137.png 300w, /wp-content/uploads/2018/05/word-image-3651-768x351.png 768w" sizes="(max-width: 978px) 100vw, 978px" /></p>
<p>
  查看目录结构
</p>
<p><img loading="lazy" decoding="async" width="642" height="366" src="/wp-content/uploads/2018/05/word-image-3652.png" class="wp-image-4109" srcset="/wp-content/uploads/2018/05/word-image-3652.png 642w, /wp-content/uploads/2018/05/word-image-3652-300x171.png 300w" sizes="(max-width: 642px) 100vw, 642px" /></p>
<p>
  对于此方式部署项目由于域名解析的目录下只有入口文件。因此项目的安全性更好
</p>
<h2>5.2、创建后台模块</h2>
<p>
  ①复制Home模块为Admin
</p>
<p><img loading="lazy" decoding="async" width="950" height="253" src="/wp-content/uploads/2018/05/word-image-3653.png" class="wp-image-4110" srcset="/wp-content/uploads/2018/05/word-image-3653.png 950w, /wp-content/uploads/2018/05/word-image-3653-300x80.png 300w, /wp-content/uploads/2018/05/word-image-3653-768x205.png 768w" sizes="(max-width: 950px) 100vw, 950px" /></p>
<p>
  ②修改后台模块下的index控制器
</p>
<p><img loading="lazy" decoding="async" width="1021" height="483" src="/wp-content/uploads/2018/05/word-image-3654.png" class="wp-image-4111" srcset="/wp-content/uploads/2018/05/word-image-3654.png 1021w, /wp-content/uploads/2018/05/word-image-3654-300x142.png 300w, /wp-content/uploads/2018/05/word-image-3654-768x363.png 768w" sizes="(max-width: 1021px) 100vw, 1021px" /></p>
<p>
  ③访问查看
</p>
<p><img loading="lazy" decoding="async" width="1086" height="261" src="/wp-content/uploads/2018/05/word-image-3655.png" class="wp-image-4112" srcset="/wp-content/uploads/2018/05/word-image-3655.png 1086w, /wp-content/uploads/2018/05/word-image-3655-300x72.png 300w, /wp-content/uploads/2018/05/word-image-3655-768x185.png 768w, /wp-content/uploads/2018/05/word-image-3655-1024x246.png 1024w" sizes="(max-width: 1086px) 100vw, 1086px" /></p>
<h2>5.3、处理URL地址</h2>
<h3>5.3.1、隐藏入口文件</h3>
<p>
  ①修改Apache的配置启用重写模式
</p>
<p><img loading="lazy" decoding="async" width="806" height="359" src="/wp-content/uploads/2018/05/word-image-3656.png" class="wp-image-4113" srcset="/wp-content/uploads/2018/05/word-image-3656.png 806w, /wp-content/uploads/2018/05/word-image-3656-300x134.png 300w, /wp-content/uploads/2018/05/word-image-3656-768x342.png 768w" sizes="(max-width: 806px) 100vw, 806px" /></p>
<p>
  ②设置虚拟主机可以重启
</p>
<p><img loading="lazy" decoding="async" width="948" height="486" src="/wp-content/uploads/2018/05/word-image-3657.png" class="wp-image-4114" srcset="/wp-content/uploads/2018/05/word-image-3657.png 948w, /wp-content/uploads/2018/05/word-image-3657-300x154.png 300w, /wp-content/uploads/2018/05/word-image-3657-768x394.png 768w" sizes="(max-width: 948px) 100vw, 948px" /></p>
<p>
  重写规则文件已经拷贝
</p>
<p>
  ③重启Apache访问测试
</p>
<p><img loading="lazy" decoding="async" width="969" height="470" src="/wp-content/uploads/2018/05/word-image-3658.png" class="wp-image-4115" srcset="/wp-content/uploads/2018/05/word-image-3658.png 969w, /wp-content/uploads/2018/05/word-image-3658-300x146.png 300w, /wp-content/uploads/2018/05/word-image-3658-768x373.png 768w" sizes="(max-width: 969px) 100vw, 969px" /></p>
<p>
  ④创建测试方法使用U函数生成
</p>
<p><img loading="lazy" decoding="async" width="929" height="479" src="/wp-content/uploads/2018/05/word-image-3659.png" class="wp-image-4116" srcset="/wp-content/uploads/2018/05/word-image-3659.png 929w, /wp-content/uploads/2018/05/word-image-3659-300x155.png 300w, /wp-content/uploads/2018/05/word-image-3659-768x396.png 768w" sizes="(max-width: 929px) 100vw, 929px" /></p>
<p>
  ⑤访问测试
</p>
<p><img loading="lazy" decoding="async" width="498" height="206" src="/wp-content/uploads/2018/05/word-image-3660.png" class="wp-image-4117" srcset="/wp-content/uploads/2018/05/word-image-3660.png 498w, /wp-content/uploads/2018/05/word-image-3660-300x124.png 300w" sizes="(max-width: 498px) 100vw, 498px" /></p>
<p>
  ⑥设置为重写模式
</p>
<p><img loading="lazy" decoding="async" width="981" height="416" src="/wp-content/uploads/2018/05/word-image-3661.png" class="wp-image-4118" srcset="/wp-content/uploads/2018/05/word-image-3661.png 981w, /wp-content/uploads/2018/05/word-image-3661-300x127.png 300w, /wp-content/uploads/2018/05/word-image-3661-768x326.png 768w" sizes="(max-width: 981px) 100vw, 981px" /></p>
<p>
  再次查看效果
</p>
<p><img loading="lazy" decoding="async" width="517" height="176" src="/wp-content/uploads/2018/05/word-image-3662.png" class="wp-image-4119" srcset="/wp-content/uploads/2018/05/word-image-3662.png 517w, /wp-content/uploads/2018/05/word-image-3662-300x102.png 300w" sizes="(max-width: 517px) 100vw, 517px" /></p>
<h3>5.3.2、隐藏Home模块</h3>
<p>
  ①设置默认的模块以及容许访问的模块
</p>
<p><img loading="lazy" decoding="async" width="967" height="472" src="/wp-content/uploads/2018/05/word-image-3663.png" class="wp-image-4120" srcset="/wp-content/uploads/2018/05/word-image-3663.png 967w, /wp-content/uploads/2018/05/word-image-3663-300x146.png 300w, /wp-content/uploads/2018/05/word-image-3663-768x375.png 768w" sizes="(max-width: 967px) 100vw, 967px" /></p>
<p>
  ②查看效果
</p>
<p><img loading="lazy" decoding="async" width="824" height="209" src="/wp-content/uploads/2018/05/word-image-3664.png" class="wp-image-4121" srcset="/wp-content/uploads/2018/05/word-image-3664.png 824w, /wp-content/uploads/2018/05/word-image-3664-300x76.png 300w, /wp-content/uploads/2018/05/word-image-3664-768x195.png 768w" sizes="(max-width: 824px) 100vw, 824px" /></p>
<h2>5.4、实现后台的首页显示</h2>
<p>
  ①修改Index控制器代码
</p>
<p><img loading="lazy" decoding="async" width="948" height="476" src="/wp-content/uploads/2018/05/word-image-3665.png" class="wp-image-4122" srcset="/wp-content/uploads/2018/05/word-image-3665.png 948w, /wp-content/uploads/2018/05/word-image-3665-300x151.png 300w, /wp-content/uploads/2018/05/word-image-3665-768x386.png 768w" sizes="(max-width: 948px) 100vw, 948px" /></p>
<p>
  ②创建视图目录
</p>
<p><img loading="lazy" decoding="async" width="926" height="210" src="/wp-content/uploads/2018/05/word-image-3666.png" class="wp-image-4123" srcset="/wp-content/uploads/2018/05/word-image-3666.png 926w, /wp-content/uploads/2018/05/word-image-3666-300x68.png 300w, /wp-content/uploads/2018/05/word-image-3666-768x174.png 768w" sizes="(max-width: 926px) 100vw, 926px" /></p>
<p>
  ③拷贝首页模板
</p>
<p><img loading="lazy" decoding="async" width="1287" height="541" src="/wp-content/uploads/2018/05/word-image-3667.png" class="wp-image-4124" srcset="/wp-content/uploads/2018/05/word-image-3667.png 1287w, /wp-content/uploads/2018/05/word-image-3667-300x126.png 300w, /wp-content/uploads/2018/05/word-image-3667-768x323.png 768w, /wp-content/uploads/2018/05/word-image-3667-1024x430.png 1024w" sizes="(max-width: 1287px) 100vw, 1287px" /></p>
<p>
  ④查看效果
</p>
<p><img loading="lazy" decoding="async" width="956" height="399" src="/wp-content/uploads/2018/05/word-image-3668.png" class="wp-image-4125" srcset="/wp-content/uploads/2018/05/word-image-3668.png 956w, /wp-content/uploads/2018/05/word-image-3668-300x125.png 300w, /wp-content/uploads/2018/05/word-image-3668-768x321.png 768w" sizes="(max-width: 956px) 100vw, 956px" /></p>
<p>
  ⑤拷贝其他模板
</p>
<p><img loading="lazy" decoding="async" width="1312" height="517" src="/wp-content/uploads/2018/05/word-image-3669.png" class="wp-image-4126" srcset="/wp-content/uploads/2018/05/word-image-3669.png 1312w, /wp-content/uploads/2018/05/word-image-3669-300x118.png 300w, /wp-content/uploads/2018/05/word-image-3669-768x303.png 768w, /wp-content/uploads/2018/05/word-image-3669-1024x404.png 1024w" sizes="(max-width: 1312px) 100vw, 1312px" /></p>
<p>
  ⑥查看效果
</p>
<p><img loading="lazy" decoding="async" width="1174" height="381" src="/wp-content/uploads/2018/05/word-image-3670.png" class="wp-image-4127" srcset="/wp-content/uploads/2018/05/word-image-3670.png 1174w, /wp-content/uploads/2018/05/word-image-3670-300x97.png 300w, /wp-content/uploads/2018/05/word-image-3670-768x249.png 768w, /wp-content/uploads/2018/05/word-image-3670-1024x332.png 1024w" sizes="(max-width: 1174px) 100vw, 1174px" /><br />
<img loading="lazy" decoding="async" width="782" height="169" src="/wp-content/uploads/2018/05/word-image-3671.png" class="wp-image-4128" srcset="/wp-content/uploads/2018/05/word-image-3671.png 782w, /wp-content/uploads/2018/05/word-image-3671-300x65.png 300w, /wp-content/uploads/2018/05/word-image-3671-768x166.png 768w" sizes="(max-width: 782px) 100vw, 782px" /></p>
<p>
  ⑦修改首页的模板
</p>
<p><img loading="lazy" decoding="async" width="1088" height="610" src="/wp-content/uploads/2018/05/word-image-3672.png" class="wp-image-4129" srcset="/wp-content/uploads/2018/05/word-image-3672.png 1088w, /wp-content/uploads/2018/05/word-image-3672-300x168.png 300w, /wp-content/uploads/2018/05/word-image-3672-768x431.png 768w, /wp-content/uploads/2018/05/word-image-3672-1024x574.png 1024w" sizes="(max-width: 1088px) 100vw, 1088px" /></p>
<h2>5.5、处理后台资源地址</h2>
<p>
  ①拷贝资源文件
</p>
<p><img loading="lazy" decoding="async" width="1318" height="419" src="/wp-content/uploads/2018/05/word-image-3673.png" class="wp-image-4130" srcset="/wp-content/uploads/2018/05/word-image-3673.png 1318w, /wp-content/uploads/2018/05/word-image-3673-300x95.png 300w, /wp-content/uploads/2018/05/word-image-3673-768x244.png 768w, /wp-content/uploads/2018/05/word-image-3673-1024x326.png 1024w" sizes="(max-width: 1318px) 100vw, 1318px" /></p>
<p>
  ②自定义模板替换
</p>
<p><img loading="lazy" decoding="async" width="935" height="534" src="/wp-content/uploads/2018/05/word-image-3674.png" class="wp-image-4131" srcset="/wp-content/uploads/2018/05/word-image-3674.png 935w, /wp-content/uploads/2018/05/word-image-3674-300x171.png 300w, /wp-content/uploads/2018/05/word-image-3674-768x439.png 768w" sizes="(max-width: 935px) 100vw, 935px" /></p>
<p>
  ③修改top模板
</p>
<p><img loading="lazy" decoding="async" width="1073" height="453" src="/wp-content/uploads/2018/05/word-image-3675.png" class="wp-image-4132" srcset="/wp-content/uploads/2018/05/word-image-3675.png 1073w, /wp-content/uploads/2018/05/word-image-3675-300x127.png 300w, /wp-content/uploads/2018/05/word-image-3675-768x324.png 768w, /wp-content/uploads/2018/05/word-image-3675-1024x432.png 1024w" sizes="(max-width: 1073px) 100vw, 1073px" /></p>
<p>
  ④修改menu模板
</p>
<p><img loading="lazy" decoding="async" width="1079" height="491" src="/wp-content/uploads/2018/05/word-image-3676.png" class="wp-image-4133" srcset="/wp-content/uploads/2018/05/word-image-3676.png 1079w, /wp-content/uploads/2018/05/word-image-3676-300x137.png 300w, /wp-content/uploads/2018/05/word-image-3676-768x349.png 768w, /wp-content/uploads/2018/05/word-image-3676-1024x466.png 1024w" sizes="(max-width: 1079px) 100vw, 1079px" /></p>
<p>
  ⑤修改main模板
</p>
<p><img loading="lazy" decoding="async" width="1076" height="525" src="/wp-content/uploads/2018/05/word-image-3677.png" class="wp-image-4134" srcset="/wp-content/uploads/2018/05/word-image-3677.png 1076w, /wp-content/uploads/2018/05/word-image-3677-300x146.png 300w, /wp-content/uploads/2018/05/word-image-3677-768x375.png 768w, /wp-content/uploads/2018/05/word-image-3677-1024x500.png 1024w" sizes="(max-width: 1076px) 100vw, 1076px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/4022.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
