thinkphp5是一個全新的版本它不再兼容以前的版本,改動比較大。個人認為它很像YII2,如果你是YII2的老司機,上手tp5學(xué)習(xí)成本會比較小。TP5首次支持使用composer的方式安裝,看起來更加具有現(xiàn)代框架的氣質(zhì)。本文不打算寫成文檔,雖然TP的官方文檔值得呵呵。只記錄一些個人覺得有點價值的東西和大家分享,希望能幫大家少踩一些坑~
1.關(guān)于dump方法(將變量,對象數(shù)組等以更友好的方式打印出來)
正常情況下dump打印出來的數(shù)組和變量是友好的,有適當?shù)目s進排版。不過也有特珠的情況,如果你和我一樣使用wampServer之類的在本機調(diào)試,很可能默認開啟了Xdebug。解決方法是在php.ini當中關(guān)掉xdebug。
2.關(guān)于$_EVN(全局環(huán)境變量)打印出來是空的數(shù)組
解決方法依然是改php.ini將variables_order = "EGPCS",不過不推薦改配置,據(jù)說是影響性能,而且thinkphp5.0封裝了一些獲取環(huán)境變量的方法,更好的做法是在核心文件夾的同級創(chuàng)建.env文件,在里面以key=>value的方法如:
env_type=test
使用\think\Env::get("env_type")來獲取值,利用這種方式可以方便在本機和服務(wù)器以及開發(fā)測試環(huán)境當中部署不同的配置文件
3.在tp5當中配置使用redis
首先在config.php當中加入redis的配置如下,可以從核心文件夾的慣例配置文件convention.php中復(fù)制,
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.關(guān)于Request對象
Request請引入命名空間think\Request;
如下是常用的方法,就不一一解釋了
dump($req->method());
dump($req->pathinfo());
dump($req->path());
dump($req->get());//普通get格式
dump($req->param());//pathinfo的參數(shù)
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.關(guān)于改變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.為各模塊創(chuàng)建單獨的配置文件,只對本模塊有效
在配置文件目錄中以模塊名如admin創(chuàng)建子文件夾,并在子文件夾中新建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} 展示變量的值,視圖中仍然支持原生的寫法,更多的替換寫法,請自行g(shù)oogle或者參看文檔
10.不使用模板渲染頁面
return $this->display('hello,{$content}',[
"content"=>"world!"
]);
hello,{$content}這段代碼只能用單引號包裹,如果要用雙引號請在$前面加上轉(zhuǎn)義符\,否則會報錯
11.修改模板引擎標簽標記,來解決tp跟前端框架的沖突如vue.js等
解決方法:修改配置項
'tpl_begin' => '{',
// 模板引擎普通標簽結(jié)束標記
'tpl_end' => '}',
12.全局替換視圖中的字符串
修改配置項
// 視圖輸出字符串內(nèi)容替換
'view_replace_str' => [
'hello'=>'olleh'
],
完成以上配置,相關(guān)作用域的hello字符串將全部替換成olleh
13.在視圖中使用引用css圖片等資源
在視圖中可以直接使用__ROOT__,__STATIC__,__CSS__,__JS__,__URL__等方式引用正確的路徑
比如
<img src="__STATIC__/images/psb.jpg"/>
14.在視圖中使用$Think訪問系統(tǒng)變量
如:
$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//獲取系統(tǒng)中的常量
$Think.APP_PATH等同于上面的方式
15.在模板當中使用注釋
{/*
我是模板注釋kwgwgwgfdfdskfskdddsdffdfadfsdfddd
*/}
16.在視圖中使用原生插入原生代碼
在視圖中可以使用<?php ?>標簽插入原生代碼,或者使用{php} {/php}標簽對,在當中插入普通的php代碼即可
17.在視圖中遍歷數(shù)組的常用方法
- volist
{php}
$empty = '沒有數(shù)據(jù)';//當填充數(shù)據(jù)為空時,替換模板
{/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頁面內(nèi)容
21.使用include方式引用公共部分
{include file="common/footer"/}//將公共部分單獨存放,使用include引入
22.在使用布局的頁面中修改不同的頁面標題
<title>{$title}</title><!---layout----->
$this->assign([
'title'=>'page1'
]);//在對應(yīng)的controller ->action中分配變量