thinkphp是一个MVC模式的框架,感觉和Java的MVC框架大同小异

thinphp5的安装

开发环境:

1、PHP版本>=5.4.0
2、需要依赖包:PDO、MbString、CURL、PHP Extension
3、Mysql 和 Apache或Nginx服务器
从官网下载最新的tp5安装包并解压,然后放入Apache网站目录www下面
调整服务器的根目录到www/tp5/public
访问localhost如果有:)说明安装成功

tp5目录结构和规范

application应用目录

application/index        //index文件夹为一个index模块
    application/index/controller        //controller为index模块的控制层,就是MVC中的C

    application/index/model        //model为index模块的模型层,就是MVC中的M

    application/index/view         //model为index模块的展示层,就是MVC中的V

application/command.php        //控制台配置文件,当我们用命令行执行tp5,就会读取command.php的配置

application/common.php        //编写一些通用函数可以在所有模块中调用

application/config.php        //应用配置文件,所有模块的通用配置文件

application/database.php        //数据库配置文件

application/route.php        //路由配置文件,对url的美化

application/tags.php        //框架拓展配置文件

extend第三方类库

public入口文件夹

public/favicon.ico        //网页图标

public/index.php        //网站(整个应用)的入口文件

public/robots.text        //搜索引擎爬虫文件,可以定义某些url可以被爬取,有些url不能被爬取

public/router.php        //使用php内置的webserver来启动tp5

                     命令:   php -s localhost:8888 router.php

                    浏览器中输入localhost:8888就可以访问tp5应用了

public/ststic        //放置网站的静态文件,如css、js、img等

runtime网站运行中的缓存文件,日志、缓存、编译文件等等

thinkphp核心框架文件

thinkphp/base.php        //定义的一些常量

thinkphp/convention.php        //框架默认配置文件

thinkphp/helper.php        //助手函数

thinkphp/lang        //语言包

thinkphp/library        //框架的核心

thinkphp/start.php        //框架启动文件

thinkphp/tpl        //默认模板

等等。。。😵

规范:

1、目录使用小写+下划线的方式命名

2、类库函数文件名均以.php结尾

3、类的文件名均以命名空间定义,且命名孔家岸和类库文件所在的路径一致

4、类文件采用驼峰首字母大写 其余文件为小写+下划线命名

5、类名和类文件名保持一致,采用驼峰命名 首字母大写

6、类采用驼峰命名 首字母大写不需要添加后缀

7、函数使用驼峰命名 首字母小写 如(getUserInfo)

8、属性名采用驼峰 首字母小写 如(tableName)

9、以双下划线__开头的函数或方法为魔术方法

10、常量以大写字母和下划线命名

11、配置参数以小写字母和下划线命名

12、数据库的表和字段采用小写+写划线的命名方式 不能以写划线开头

TP5的配置

1、惯例配置

在thinkphp/convention.php中直接修改默认配置

2、应用配置

在public/index.php中添加
    //定义应用目录

define('CONF_PATH',DIR.'/../conf/');
再在根目录下新建文件夹conf并新建文件config.php

<?php

return[
// ' 配置内容'
//比如  'app_email'=>'asd123wto@163.com',
//      'app_debug'=>false  //可直接修改原有配置内容
];

3、扩展配置

在./conf/下新建文件夹extra
在extra下新建要配置的key名.php

例如:database.php

<?php
return[
//数据库类型
'type'=>'mysql',
//数据库连接DSN配置
'dsn'=>'',
....
];

这样就可以拓展配置database

当然database可以直接在conf/下配置

4、场景配置

在conf/下新建home.php或者office.php(在家中的配置和在公司的配置)
在config.php中添加'app_status' => 'home'

就可以使用home中的配置,在公司改成'app_status' => 'office'就好了

5、模块配置

在conf/下新建与模块名一直的文件夹,此文件夹下新建config.php,该配置只对该模块生效

例如:conf/index/config.php只对application/index模块生效

在模块配置中可以扩展配置

6、动态配置

“在控制器中生效的配置”

在控制器中新建方法

public function __construct(){

config('','');
}

在助手函数config()中就可以添加动态配置,在此控制器中所有方法中生效

config()也可以直接写在需要的方法中,只在该方法生效

TP5的URL和路由

1、隐藏URL入口文件index.php

在Apache的配置文件apache.conf或httpd.conf中修改AllowOverride 为All,重启Apache

注意使用Apache的隐藏功能,则执行文件public/.htaccess规则

2、绑定入口文件

在public/index.php中填写

//绑定模块
define('BIND_MODULE','admin/index');

则入口文件绑定为admin模块下的index控制器,在浏览器直接输入localhost则显示admin下的index控制器

注:写第三方接口时:需建立public/api.php

<?php

define("APP_PATH",__DIR__.'/../app/');
define("CONF_PATH",__DIR__.'/../conf/');
define("BIND_MODULE",'api');

require(__DIR__.'/../thinkphp/start.php');

这样别人在使用的时候只能访问api模块下的内容

3、路由

在conf/下新建route.php

<?php
return[
'news/:id'=>'index/index/info'
];

会将id的值传给index模块下的index控制器下的info方法

原来访问是/index/index/info/5 现在可以访问/news/5.html

TP5的视图和模板

1、视图view

在控制器中直接return view();则获取的是当前模块下的view/index/index.html
如果在view()传递第一个参数,是修改模板文件目录的 。 比如:return view('upload');则路径为当前模块下view/index/upload.html

如果传入view('public/upload'); 则路径为view/public/upload.html

如果传入view('./index.html'); 则路径为入口文件index.php同级目录下的index.html "./"开头表示public目录

如果在view()传入第二个参数,第二个参数为一个数组。 比如:

return view('index',[
'email'=>'asd123wto@163.com'
]);

则就可以在index.html中书写{$email}获取到"asd123wto@163.com"

如果在view()传递第三个参数,第三个参数也为一个数组。 比如:

return view('index',[
'email'=>'asd123wto@163.com'
],[
'STATIC'=>'当前是static的替换内容'
]);

就可以在index.html中直接书写STATIC就能得到它所对应的值"当前是static的替换内容"

当我们控制器继承了Conteroller就可以使用助手函数fetch()

return $this->fetch('public/upload');

它的用法和view()是一样的;

fetch()方法还有一个兄弟方法assign()专门用来传值,比如:

$this->assign('email','asd123wto@163.com');
return $this->fetch();

在index.html中就可以用{$email}取值
display()方法是传一个字符串,进行模板替换和字符串输出,第二个参数也可以传值,同样也可以使用assign()

2、变量输出、赋值替换

赋值除了view()、assign()、fetch()外还有:

$this->view->key='value';
View::share('key','value');

当然这两种和assign()要在fetch()跳转之前实现

替换除了view()和fetch()的替换,还有配置文件的替换

在config下配置

'view_replace_str'=>[
'__123__'=>'一二三'
]

在html中输入__123__就会得到一二三

3、系统变量原生标签

使用Think就可以调用tp的原生变量
例如:

    {$Think.cookis.key}就能获取cookie里key的值

    {$Think.session.key}就能获取session里key的值

    {$Think.get.id}就能获取get里id的值

    {$Think.APP_PATH}就能获取APP_PATH的常量的值

等等等等。。。😵

4、变量输出 调节器

传入一个email,可以在视图层

        {$email|md5}    //获取md5加密后的email变量

        {$email|md5|strtoupper} //大写md5加密

        {$email|substr=0,8}    //获取semail的前8位

        {$time|date="Y-m-d",###}    //把time时间戳转化成年月日

    当没有email传入时

        {$email|default="asd123wto@163.com"}    //就会显示默认值“asd123wto@163.com”

    当视图层输入

{literal}
{$email}
{/literal}

则输出{$email}不会被替换

5、模板循环标签

控制层向视图层传入一个数组list,在视图层就可以用以下方法遍历

        1、{volist name="list" id="vo"}
	<p>{$vo.key}</p>
	{/volist}
    	{volist}里的参数

                    offset="2"        //就会从第二条记录开始遍历

                    length="1"      //指定的遍历长度

                    mod="2"        //当前循环的次数取余并可以{$mod}显示

                    empty="这里没有数组"        //当没有数组时,就会输出empty里的字段

                    key="s"        //当前循环的次数{$s}显示

        2、{foreach $list as $vo}或者{foreach name="list" item="vo"}
		<p>{$vo.key}</p>
		<p>{$key}</p>    //输出数组下标
	   {/foreach}
        3、{for start="1" end="10"}
		<p>{$i}</p>    //取得1-10
	{/for}

	{for start="1" end="10" step=2}
	{$i}                //step会使每次i+=2,得到1、3、5、7、9
	{/for}

6、比较标签

传入$a变量

//{eq}判断a与10是否相等
{eq name="a" value="10"}
    <p>相等</p>
{else/}
    <p>不相等</p>
{/eq}

//以此类推
//
判断是否不相等
//
判断是否大于
//
判断是否小于
//
判断是否大于等于
//
判断是否小于等于

//注:name中使用变量不用$;value中使用变量需要加上$

7、条件判断标签

   1、switch    传入$a

{switch name="a"}
    {case value="1"}
    <p>name="1"</p>
    {/case}
    {case value="2'}
    <p>name="2"</p>
    {/case}
    {default/}
    <p>默认值</p>
{/switch}
        2、range  传入$a

{range name="a" value="1,2,3" type="in"}    //type="in","notin","between","notbetween"
<p>当前a是1、2、3中的一个</p>               //当type="butween" 则value的值为在两个数之间
{else/}
不是
{/range}

等于

{in name="a" value="1、2、3"}
{else/}
{/in}
        3、defined 判断常量是否定义

{defined name="APP_PATH"}
{else/}
{/defined}
        4、if判断

{if condition="($Think.get.level==1) AND ($Think.get.id==10)"}    //AND,OR
{else/}
{/if}

😴终于整理完了