Thinkphp5 简单上手一
thinkphp5是一个全新的版本它不再兼容以前的版本,改动比较大。个人认为它很像YII2,如果你是YII2的老司机,上手tp5学习成本会比较小。TP5首次支持使用composer的方式安装,看起来更加具有现代框架的气质。本文不打算写成文档,虽然TP的官方文档值得呵呵。只记录一些个人觉得有点价值的东西和大家分享,希望能帮大家少踩一些坑~
1.关于dump方法(将变量,对象数组等以更友好的方式打印出来)
正常情况下dump打印出来的数组和变量是友好的,有适当的缩进排版。不过也有特珠的情况,如果你和我一样使用wampServer之类的在本机调试,很可能默认开启了Xdebug。解决方法是在php.ini当中关掉xdebug。
2.关于$_EVN(全局环境变量)打印出来是空的数组
解决方法依然是改php.ini将variables_order = "EGPCS"
,不过不推荐改配置,据说是影响性能,而且thinkphp5.0封装了一些获取环境变量的方法,更好的做法是在核心文件夹的同级创建.env文件,在里面以key=>value的方法如:
env_type=test
使用\think\Env::get("env_type")
来获取值,利用这种方式可以方便在本机和服务器以及开发测试环境当中部署不同的配置文件
3.在tp5当中配置使用redis
首先在config.php当中加入redis的配置如下,可以从核心文件夹的惯例配置文件convention.php中复制,
return [
'redis'=>[
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'expire' => 0,
'persistent' => false,
'prefix' => '',
],
];
然后就可以在控制器中使用如下代码方便的进行操作redis了
$opt = Config::get("redis");
$res = new Redis($opt);
$name = $res->get("name");
echo $name;
4.关于Request对象
Request请引入命名空间think\Request;
如下是常用的方法,就不一一解释了
dump($req->method());
dump($req->pathinfo());
dump($req->path());
dump($req->get());//普通get格式
dump($req->param());//pathinfo的参数
dump($req->post());
session("username","damon");
dump($req->session());
cookie("age",33);
dump($req->cookie());
dump($req->cookie('PHPSESSID'));
dump($req->module());
dump($req->controller());
dump($req->action());
dump($req->url());
dump($req->baseUrl());
5.关于改变Response类型
不推荐使用类似于echo json_encode($arr);之类的代码,推荐使用tp5提供的方式来改变返回类型,方法是改变配置项中的default_return_type
参考如下代码:
$res = [
"code"=>100,
"result"=>[
"list"=>[1,2,3,4,5,6]
]
];
Config::set('default_return_type','xml');
//Config::set('default_return_type','json');
//Config::set('default_return_type','jsonp');
return $res;
6.打印所有的当前所有配置项
dump(config());
7.修改配置文件目录
修改public文件夹下的index.php当中代码,并在合适的目录新建配置文件目录
define('CONF_PATH', __DIR__.'/../conf/');
8.为各模块创建单独的配置文件,只对本模块有效
在配置文件目录中以模块名如admin创建子文件夹,并在子文件夹中新建config.php
9.在controller中传递变量,在view中接受变量
- assign
$this->assign("aa","hahaha");
- fetch
return $this->fetch('viewdemo',[
'name'=>'hello',
'description'=>'world'
]);
- share
\think\View::share('bb','bbb');
在视图当中可以使用{$name} {$aa} {$description}
展示变量的值,视图中仍然支持原生的写法,更多的替换写法,请自行google或者参看文档
10.不使用模板渲染页面
return $this->display('hello,{$content}',[
"content"=>"world!"
]);
hello,{$content}这段代码只能用单引号包裹,如果要用双引号请在$前面加上转义符\,否则会报错
11.修改模板引擎标签标记,来解决tp跟前端框架的冲突如vue.js等
解决方法:修改配置项
'tpl_begin' => '{',
// 模板引擎普通标签结束标记
'tpl_end' => '}',
12.全局替换视图中的字符串
修改配置项
// 视图输出字符串内容替换
'view_replace_str' => [
'hello'=>'olleh'
],
完成以上配置,相关作用域的hello字符串将全部替换成olleh
13.在视图中使用引用css图片等资源
在视图中可以直接使用,__STATIC__,__CSS__,__JS__,/index
等方式引用正确的路径
比如
<img src="__STATIC__/images/psb.jpg"/>
14.在视图中使用$Think访问系统变量
如:
$Think.session.name //获取session中的变量
$Think.cookie.age //获取cookie中的变量
$Think.server.HTTP_HOST //获取$_SERVER中的变量
$Think.get.id //获取get中的变量
$Think.post.email //获取post中的变量
$Think.const.APP_PATH//获取系统中的常量
$Think.APP_PATH等同于上面的方式
15.在模板当中使用注释
{/*
我是模板注释kwgwgwgfdfdskfskdddsdffdfadfsdfddd
*/}
16.在视图中使用原生插入原生代码
在视图中可以使用<?php ?>标签插入原生代码,或者使用{php} {/php}标签对,在当中插入普通的php代码即可
17.在视图中遍历数组的常用方法
- volist
{php}
$empty = '没有数据';//当填充数据为空时,替换模板
{/php}
{volist name="data" id="item" empty="$empty" key="i" offset="0" length="3" mod="1"}
{$i}=>{$item.name}--{$item.age}
{/volist}
- foreach
{foreach $data as $item}
{$i}=>{$item.name}--{$item.age}
{/foreach}
- for
{for start="1" end="10" step="2" name="i"}
{$i}<br/>
{/for}
18.在视图中使用比较标签
- eq(equal)
{eq name="val1" value="11"}
等于11
{else/}
不等于11
{/eq}
- neq
{neq name="val1" value="10"}
不等于10
{else/}
等于10
{/neq}
- gt
{gt name="val1" value="5"}
大于5
{else/}
小于等于5
{/gt}
- lt
{lt name="val1" value="10"}
小于10
{else/}
大于等于10
{/lt}
- egt
{egt name="val1" value="10"}
大于等于10
{else/}
小于10
{/egt}
- elt
{elt name="val1" value="10"}
小于等于10
{else/}
大于10
{/elt}
- 与变量的比较需要加上$符
{eq name="val1" value="$val2"}
val1 = val2
{/eq}
19.在模板中使用条件判断标签
- switch
{switch name="val1"}
{case value="1"}1{/case}
{case value="5"}5{/case}
{case value="10"}10{/case}
{case value="15"}15{/case}
{case value="20"}20{/case}
{case value="30|40|50"}30 or 40 or 50 {/case}
{default/}0
{/switch}
- range
{range name="val2" type="in" value="1,2,3,4,5"}
val2 in vals
{else/}
val2 not in vals
{/range}
- in
{in name="val2" value="1,2,3,4,5"}
val2 in vals
{else/}
val2 not in vals
{/in}
- notin
{notin name="val2" value="1,2,3,4,5"}
val2 not in vals
{else/}
val2 in vals
{/notin}
- between
{between name="val2" value="1,10"}
val2 between 1-10
{else/}
val2 notbetween 1-10
{/between}
- notbetween
{notbetween name="val2" value="1,10"}
val2 notbetween 1-10
{else/}
val2 between 1-10
{/notbetween}
- defined
{defined name="APP_PATH"}
APP_PATH is defined.
{else/}
APP_PATH is not defined.
{/defined}
- if
{if condition=" ($val2 != 2) AND ($val2 !=3) "}
$val2 != 2 and $val2 !=3
{else/}
$val2 = 2 or $val2 = 3
{/if}
20.在视图中使用布局文件
修改如下配置项,开启使用布局文件
'template' => [
'layout_on' => true,
'layout_name' =>'layout',
],
TP5中使用布局文件的方式和YII2.0当中使用布局文件的方式几乎是一致的
布局文件中使用{__CONTENT__}
代替具体渲染的view页面内容
21.使用include方式引用公共部分
{include file="common/footer"/}//将公共部分单独存放,使用include引入
22.在使用布局的页面中修改不同的页面标题
<title>{$title}</title><!---layout----->
$this->assign([
'title'=>'page1'
]);//在对应的controller ->action中分配变量