腳注 [^RUNOOB]。
[^RUNOOB]: 跳至頂部
**內置標簽包括:**
| 標簽名 | 作用 | 包含屬性 | 標簽分類|
| --- | --- | --- | --- |
| [include](#include) | 包含外部模板文件(閉合) | file |
| [load ](#load)| 導入資源文件(閉合 包括js css import別名) | file,href,type,value,basepath |
| [volist](#volist)| 循環數組數據輸出 | name,id,offset,length,key,mod |循環輸出|
| [foreach ](#foreach)| 數組或對象遍歷輸出 | name,item,key |循環輸出|
| [for](#for)| For循環數據輸出 | name,from,to,before,step |循環輸出|
| [switch](#switch)| 分支判斷輸出 | name |條件判斷|
| case| 分支判斷輸出(必須和switch配套使用) | value,break |
| default | 默認情況輸出(閉合 必須和switch配套使用) | 無 |
| [range](#range) | 范圍判斷輸出(包括in notin between notbetween別名) | name,value,type |條件判斷|
| [present](#present) | 判斷是否賦值 | name |條件判斷|
| [notpresent](#notpresent) | 判斷是否尚未賦值 | name |條件判斷|
| [empty](#empty) | 判斷數據是否為空 | name |條件判斷|
| [notempty](#notempty) | 判斷數據是否不為空 | name |條件判斷|
| [defined](#defined) | 判斷常量是否定義 | name |條件判斷|
| [notdefined](#notdefined) | 判斷常量是否未定義 | name |
| [define](#define) | 常量定義(閉合) | name,value |定義標簽|
| [assign](#assign) | 變量賦值(閉合) | name,value |定義標簽|
|[if](#if)|條件判斷輸出|condition|件判斷|
| elseif | 條件判斷輸出(閉合 必須和if標簽配套使用) | condition |
| else | 條件不成立輸出(閉合 可用于其他標簽) | 無 |
| [php](#php) | 使用php代碼 | 無 |
| [compare](#compare) | 比較輸出:eq或者 equal(等于)、neq 或者notequal(不等于)、gt(大于)、egt(大于等于)、lt(小于)、elt(小于等于)、heq(恒等于)、nheq(不恒等于) | name,value,type |比較標簽|
模板引擎支持標簽的多層嵌套功能,可以對標簽庫的標簽指定可以嵌套。
系統內置的標簽中,volist、switch、if、elseif、else、foreach、compare(包括所有的比較標簽)、(not)present、(not)empty、(not)defined等標簽都可以嵌套使用。例如:
~~~
{volist name="list" id="vo"}
{volist name="vo['sub']" id="sub"}
{$sub.name}
{/volist}
{/volist}
~~~
# **循環輸出標簽**
## <span id="volist">**VOLIST標簽**</span>
volist標簽通常用于查詢數據集(select方法)的結果輸出,通常模型的select方法返回的結果是一個二維數組,可以直接使用volist標簽進行輸出。 在控制器中首先對模版賦值:
~~~
$list = User::all();
$this->assign('list',$list);
~~~
在模版定義如下,循環輸出用戶的編號和姓名:
~~~
{volist name="list" id="vo"}
{$vo.id}:{$vo.name}<br/>
{/volist}
~~~
Volist標簽的name屬性表示模板賦值的變量名稱,因此不可隨意在模板文件中改變。id表示當前的循環變量,可以隨意指定,但確保不要和name屬性沖突,例如:
~~~
{volist name="list" id="data"}
{$data.id}:{$data.name}<br/>
{/volist}
~~~
支持輸出查詢結果中的部分數據,例如輸出其中的第5~15條記錄
~~~
{volist name="list" id="vo" offset="5" length='10'}
{$vo.name}
{/volist}
~~~
輸出偶數記錄
~~~
{volist name="list" id="vo" mod="2" }
{eq name="mod" value="1"}{$vo.name}{/eq}
{/volist}
~~~
Mod屬性還用于控制一定記錄的換行,例如:
~~~
{volist name="list" id="vo" mod="5" }
{$vo.name}
{eq name="mod" value="4"}<br/>{/eq}
{/volist}
~~~
為空的時候輸出提示:
~~~
{volist name="list" id="vo" empty="暫時沒有數據" }
{$vo.id}|{$vo.name}
{/volist}
~~~
empty屬性不支持直接傳入html語法,但可以支持變量輸出,例如:
~~~
$this->assign('empty','<span class="empty">沒有數據</span>');
$this->assign('list',$list);
~~~
然后在模板中使用:
~~~
{volist name="list" id="vo" empty="$empty" }
{$vo.id}|{$vo.name}
{/volist}
~~~
輸出循環變量:
~~~
{volist name="list" id="vo" key="k" }
{$k}.{$vo.name}
{/volist}
~~~
如果沒有指定key屬性的話,默認使用循環變量i,例如:
~~~
{volist name="list" id="vo" }
{$i}.{$vo.name}
{/volist}
~~~
如果要輸出數組的索引,可以直接使用key變量,和循環變量不同的是,這個key是由數據本身決定,而不是循環控制的,例如:
~~~
{volist name="list" id="vo" }
{$key}.{$vo.name}
{/volist}
~~~
模板中可以直接使用函數設定數據集,而不需要在控制器中給模板變量賦值傳入數據集變量,如:
~~~
{volist name=":fun('arg')" id="vo"}
{$vo.name}
{/volist}
~~~
## <span id="foreach">**FOREACH標簽**</span>
foreach標簽類似與volist標簽,只是更加簡單,沒有太多額外的屬性,最簡單的用法是:
~~~
{foreach $list as $vo}
{$vo.id}:{$vo.name}
{/foreach}
~~~
該用法解析后是最簡潔的。
也可以使用下面的用法:
~~~
{foreach name="list" item="vo"}
{$vo.id}:{$vo.name}
{/foreach}
~~~
name表示數據源 item表示循環變量。
可以輸出索引,如下:
~~~
{foreach name="list" item="vo" }
{$key}|{$vo}
{/foreach}
~~~
也可以定義索引的變量名
~~~
{foreach name="list" item="vo" key="k" }
{$k}|{$vo}
{/foreach}
~~~
## <span id="for"> **FOR標簽**</span>
用法:
~~~
{for start="開始值" end="結束值" comparison="" step="步進值" name="循環變量名" }
{/for}
~~~
開始值、結束值、步進值和循環變量都可以支持變量,開始值和結束值是必須,其他是可選。comparison 的默認值是lt,name的默認值是i,步進值的默認值是1,舉例如下:
~~~
{for start="1" end="100"}
{$i}
{/for}
~~~
解析后的代碼是
~~~
for ($i=1;$i<100;$i+=1){
echo $i;
}
~~~
# **比較標簽**
## <span id="compare">**compareb標簽**</span>
>[info]比較標簽用于簡單的變量比較,復雜的判斷條件可以用if標簽替換,比較標簽是一組標簽的集合,基本上用法都一致,
所有的比較標簽可以統一使用compare標簽(其實所有的比較標簽都是compare標簽的別名)
例如: 當name變量的值等于5就輸出
~~~
{compare name="name" value="5" type="eq"}value{/compare}
~~~
等效于
~~~
{eq name="name" value="5" }value{/eq}
~~~
其中type屬性的值就是上面列出的比較標簽名稱
compare標簽的別名 基本上用法都一致
如下:
~~~
{比較標簽 name="變量" value="值"}
內容
{/比較標簽}
~~~
系統支持的比較標簽以及所表示的含義分別是:
| 標簽 | 含義 |
| --- | --- |
| eq或者 equal | 等于 |
| neq 或者notequal | 不等于 |
| gt | 大于 |
| egt | 大于等于 |
| lt | 小于 |
| elt | 小于等于 |
| heq | 恒等于 |
| nheq | 不恒等于 |
他們的用法基本是一致的,區別在于判斷的條件不同,并且所有的比較標簽都可以和else標簽一起使用。
例如,要求name變量的值等于value就輸出,可以使用:
~~~
{eq name="name" value="value"}value{/eq}
~~~
或者
~~~
{equal name="name" value="value"}value{/equal}
~~~
也可以支持和else標簽混合使用:
~~~
{eq name="name" value="value"}
相等
{else/}
不相等
{/eq}
~~~
當 name變量的值大于5就輸出
~~~
{gt name="name" value="5"}value{/gt}
~~~
當name變量的值不小于5就輸出
~~~
{egt name="name" value="5"}value{/egt}
~~~
比較標簽中的變量可以支持對象的屬性或者數組,甚至可以是系統變量,例如: 當vo對象的屬性(或者數組,或者自動判斷)等于5就輸出
~~~
{eq name="vo.name" value="5"}
{$vo.name}
{/eq}
~~~
當vo對象的屬性等于5就輸出
~~~
{eq name="vo:name" value="5"}
{$vo.name}
{/eq}
~~~
當$vo\['name'\]等于5就輸出
~~~
{eq name="vo['name']" value="5"}
{$vo.name}
{/eq}
~~~
而且還可以支持對變量使用函數 當vo對象的屬性值的字符串長度等于5就輸出
~~~
{eq name="vo:name|strlen" value="5"}{$vo.name}{/eq}
~~~
變量名可以支持系統變量的方式,例如:
~~~
{eq name="Think.get.name" value="value"}相等{else/}不相等{/eq}
~~~
通常比較標簽的值是一個字符串或者數字,如果需要使用變量,只需要在前面添加“$”標志: 當vo對象的屬性等于$a就輸出
~~~
{eq name="vo:name" value="$a"}{$vo.name}{/eq}
~~~
# **條件判斷**
## <span id="switch">**SWITCH標簽**</span>
用法:
~~~
{switch name="變量" }
{case value="值1" break="0或1"}輸出內容1{/case}
{case value="值2"}輸出內容2{/case}
{default /}默認情況
{/switch}
~~~
使用方法如下:
~~~
{switch name="User.level"}
{case value="1"}value1{/case}
{case value="2"}value2{/case}
{default /}default
{/switch}
~~~
其中name屬性可以使用函數以及系統變量,例如:
~~~
{switch name="Think.get.userId|abs"}
{case value="1"}admin{/case}
{default /}default
{/switch}
~~~
對于case的value屬性可以支持多個條件的判斷,使用”|”進行分割,例如:
~~~
{switch name="Think.get.type"}
{case value="gif|png|jpg"}圖像格式{/case}
{default /}其他格式
{/switch}
~~~
表示如果$\_GET\["type"\] 是gif、png或者jpg的話,就判斷為圖像格式。
Case標簽還有一個break屬性,表示是否需要break,默認是會自動添加break,如果不要break,可以使用:
~~~
{switch name="Think.get.userId|abs"}
{case value="1" break="0"}admin{/case}
{case value="2"}admin{/case}
{default /}default
{/switch}
~~~
也可以對case的value屬性使用變量,例如:
~~~
{switch name="User.userId"}
{case value="$adminId"}admin{/case}
{case value="$memberId"}member{/case}
{default /}default
{/switch}
~~~
> 使用變量方式的情況下,不再支持多個條件的同時判斷。
簡潔的用法
~~~
{switch $User.userId}
{case $adminId}admin{/case}
{case $memberId}member{/case}
{/switch}
~~~
## <span id="if">**IF標簽**</span>
用法示例:
~~~
{if condition="($name == 1) OR ($name > 100) "} value1
{elseif condition="$name eq 2"/}value2
{else /} value3
{/if}
~~~
除此之外,我們可以在condition屬性里面使用php代碼,例如:
~~~
{if condition="strtoupper($user['name']) neq 'THINKPHP'"}ThinkPHP
{else /} other Framework
{/if}
~~~
condition屬性可以支持點語法和對象語法,例如: 自動判斷user變量是數組還是對象
~~~
{if condition="$user.name neq 'ThinkPHP'"}ThinkPHP
{else /} other Framework
{/if}
~~~
或者知道user變量是對象
~~~
{if condition="$user:name neq 'ThinkPHP'"}ThinkPHP
{else /} other Framework
{/if}
~~~
由于if標簽的condition屬性里面基本上使用的是php語法,盡可能使用**判斷標簽和Switch標簽**會更加簡潔,原則上來說,能夠用switch和比較標簽解決的盡量不用if標簽完成。因為switch和比較標簽可以使用變量調節器和系統變量。如果某些特殊的要求下面,IF標簽仍然無法滿足要求的話,可以使用原生php代碼或者PHP標簽來直接書寫代碼。
簡潔的用法
~~~
{if condition="表達式"}
{if (表達式)}
{if 表達式}
~~~
這三種寫法結果是一樣的
判斷集合是否為空
```
{if condition="empty($list) neq true" /}
集合不為空
{else /}
集合為空
{/if}
```
## <span id="present">**PRESENT 標簽**</span>
present標簽用于判斷某個變量是否已經定義,用法:
~~~
{present name="name"}
name已經賦值
{/present}
~~~
## <span id="notpresent">**NOTPRESENT 標簽**</span>
如果判斷沒有賦值,可以使用:
~~~
{notpresent name="name"}
name還沒有賦值
{/notpresent}
~~~
可以把上面兩個標簽合并成為:
~~~
{present name="name"}
name已經賦值
{else /}
name還沒有賦值
{/present}
~~~
present標簽的name屬性可以直接使用系統變量,例如:
~~~
{present name="Think.get.name"}
$_GET['name']已經賦值
{/present}
~~~
## <span id="empty">**EMPTY 標簽**</span>
empty標簽用于判斷某個變量是否為空,用法:
~~~
{empty name="name"}
name為空值
{/empty}
~~~
## <span id="notempty">**NOTEMPTY 標簽**</span>
如果判斷沒有賦值,可以使用:
~~~
{notempty name="name"}
name不為空
{/notempty}
~~~
可以把上面兩個標簽合并成為:
~~~
{empty name="name"}
name為空
{else /}
name不為空
{/empty}
~~~
name屬性可以直接使用系統變量,例如:
~~~
{empty name="Think.get.name"}
$_GET['name']為空值
{/empty}
~~~
## <span id="defined">**DEFINED 標簽**</span>
DEFINED標簽用于判斷某個常量是否有定義,用法如下:
~~~
{defined name="NAME"}
NAME常量已經定義
{/defined}
~~~
> name屬性的值要注意嚴格大小寫
如果判斷沒有被定義,可以使用:
~~~
{notdefined name="NAME"}
NAME常量未定義
{/notdefined}
~~~
可以把上面兩個標簽合并成為:
~~~
{defined name="NAME"}
NAME常量已經定義
{else /}
NAME常量未定義
{/defined}
~~~
## 范圍判斷
## <span id="range">**RANGE標簽**</span>
范圍判斷標簽包括in notin between notbetween四個標簽,都用于判斷變量是否中某個范圍。
也可以直接使用range標簽,替換in notin between notbetween四個標簽
用法:
~~~
{range name="id" value="1,2,3" type="in"}
輸出內容1
{/range}
~~~
其中type屬性的值可以用in/notin/between/notbetween,其它屬性的用法和IN或者BETWEEN一致。
## IN和NOTIN
用法: 假設我們中控制器中給id賦值為1:
~~~
$id = 1;
$this->assign('id',$id);
~~~
我們可以使用in標簽來判斷模板變量是否在某個范圍內,例如:
~~~
{in name="id" value="1,2,3"}
id在范圍內
{/in}
~~~
最后會輸出:`id在范圍內`。
如果判斷不在某個范圍內,可以使用notin標簽:
~~~
{notin name="id" value="1,2,3"}
id不在范圍內
{/notin}
~~~
最后會輸出:`id不在范圍內`。
可以把上面兩個標簽合并成為:
~~~
{in name="id" value="1,2,3"}
id在范圍內
{else/}
id不在范圍內
{/in}
~~~
name屬性還可以支持直接判斷系統變量,例如:
~~~
{in name="Think.get.id" value="1,2,3"}
$_GET['id'] 在范圍內
{/in}
~~~
> 更多的系統變量用法可以參考[系統變量](http://www.hmoore.net/manual/thinkphp5/125004)部分。
value屬性也可以使用變量,例如:
~~~
{in name="id" value="$range"}
id在范圍內
{/in}
~~~
$range變量可以是數組,也可以是以逗號分隔的字符串。
value屬性還可以使用系統變量,例如:
~~~
{in name="id" value="$Think.post.ids"}
id在范圍內
{/in}
~~~
## BETWEEN 和 NOTBETWEEN
可以使用between標簽來判斷變量是否在某個區間范圍內,可以使用:
~~~
{between name="id" value="1,10"}
輸出內容1
{/between}
~~~
同樣,也可以使用notbetween標簽來判斷變量不在某個范圍內:
~~~
{notbetween name="id" value="1,10"}
輸出內容2
{/notbetween}
~~~
也可以使用else標簽把兩個用法合并,例如:
~~~
{between name="id" value="1,10"}
輸出內容1
{else/}
輸出內容2
{/between}
~~~
當使用between標簽的時候,value只需要一個區間范圍,也就是只支持兩個值,后面的值無效,例如
~~~
{between name="id" value="1,3,10"}
輸出內容1
{/between}
~~~
實際判斷的范圍區間是`1~3`,而不是`1~10`,也可以支持字符串判斷,例如:
~~~
{between name="id" value="A,Z"}
輸出內容1
{/between}
~~~
name屬性可以直接使用系統變量,例如:
~~~
{between name="Think.post.id" value="1,5"}
輸出內容1
{/between}
~~~
value屬性也可以使用變量,例如:
~~~
{between name="id" value="$range"}
輸出內容1
{/between}
~~~
變量的值可以是字符串或者數組,還可以支持系統變量。
~~~
{between name="id" value="$Think.get.range"}
輸出內容1
{/between}
~~~
# **資源文件加載**
## <span id="load">**load 標簽**</span>
傳統方式的導入外部`JS`和`CSS`文件的方法是直接在模板文件使用:
~~~
<script type='text/javascript' src='/static/js/common.js'>
<link rel="stylesheet" type="text/css" href="/static/css/style.css" />
~~~
系統提供了專門的標簽來簡化上面的導入:
~~~
{load href="/static/js/common.js" /}
{load href="/static/css/style.css" /}
~~~
并且支持同時加載多個資源文件,例如:
~~~
{load href="/static/js/common.js,/static/css/style.css" /}
~~~
系統還提供了兩個標簽別名`js`和`css`用法和`load`一致,例如:
~~~
{js href="/static/js/common.js" /}
{css href="/static/css/style.css" /}
~~~
## <span id="include">**include 標簽**</span>
用于在模版中加載其他的模板
模版表達式的定義規則為:**模塊@控制器/操作**
>[danger]包含的模板文件中不能再使用模板布局或者模板繼承。
~~~
{include file="public/header" /}
~~~
可以一次包含多個模版,例如:
~~~
{include file="public/header,public/menu" /}
~~~
可以直接包含一個模版文件名(包含完整路徑),例如:
~~~
{include file="../application/view/default/public/header.html" /}
~~~
## 傳入參數
無論你使用什么方式包含外部模板,Include標簽支持在包含文件的同時傳入參數,例如,下面的例子我們在包含header模板的時候傳入了`title`和`keywords`參數:
~~~
{include file="Public/header" title="$title" keywords="開源WEB開發框架" /}
~~~
就可以在包含的header.html文件里面使用title和keywords變量,如下:
~~~
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>[title]</title>
<meta name="keywords" content="[keywords]" />
</head>
~~~
上面title參數傳入的是個變量$title,模板內的\[title\]最終會替換成$title的值,當然$title這個變量必須要存在。
**包含文件中可以再使用include標簽包含別的文件,但注意不要形成A包含A,或者A包含B而B又包含A這樣的死循環。**
> 注意:由于模板解析的特點,從入口模板開始解析,如果外部模板有所更改,模板引擎并不會重新編譯模板,除非在調試模式下或者緩存已經過期。如果部署模式下修改了包含的外部模板文件后,需要把模塊的緩存目錄清空,否則無法生效。
# **原生PHP**
Php代碼可以和標簽在模板文件中混合使用,可以在模板文件里面書寫任意的PHP語句代碼 ,包括下面兩種方式:
## <span id="php">**php 標簽**</span>
例如:
~~~
{php}echo 'Hello,world!';{/php}
~~~
我們建議需要使用PHP代碼的時候盡量采用php標簽,因為原生的PHP語法可能會被配置禁用而導致解析錯誤。
## 使用原生php代碼
~~~
<?php echo 'Hello,world!'; ?>
~~~
注意:php標簽或者php代碼里面就不能再使用標簽(包括普通標簽和XML標簽)了,因此下面的幾種方式都是無效的:
~~~
{php}{eq name='name'value='value'}value{/eq}{/php}
~~~
Php標簽里面使用了`eq`標簽,因此無效
~~~
{php}if( {$user} != 'ThinkPHP' ) echo 'ThinkPHP' ;{/php}
~~~
Php標簽里面使用了`{$user}`普通標簽輸出變量 ,因此無效。
~~~
{php}if( $user.name != 'ThinkPHP' ) echo 'ThinkPHP' ;{/php}
~~~
Php標簽里面使用了`$user.name`點語法變量輸出 ,因此無效。
> 簡而言之,在PHP標簽里面不能再使用PHP本身不支持的代碼。
如果設置了`tpl_deny_php`參數為true,就不能在模板中使用原生的PHP代碼,但是仍然支持PHP標簽輸出。
# **定義標簽**
## <span id="assign">**ASSIGN標簽**</span>
ASSIGN標簽用于在模板文件中定義變量,用法如下:
~~~
{assign name="var" value="123" /}
~~~
在運行模板的時候,賦值了一個`var`的變量,值是`123`。
value屬性也支持變量,例如:
~~~
{assign name="var" value="$val" /}
~~~
或者直接把系統變量賦值給var變量,例如:
~~~
{assign name="var" value="$Think.get.name" /}
~~~
相當于,執行了:`$var = $_GET['name'];`
## <span id="define">**DEFINE標簽**</span>
DEFINE標簽用于中模板中定義常量,用法如下:
~~~
{define name="MY_DEFINE_NAME" value="3" /}
~~~
在運行模板的時候,就會定義一個`MY_DEFINE_NAME`的常量。
value屬性可以支持變量(包括系統變量),例如:
~~~
{define name="MY_DEFINE_NAME" value="$name" /}
~~~
或者
~~~
{define name="MY_DEFINE_NAME" value="$Think.get.name" /}
~~~
- 目錄結構與基礎
- 修改數據后頁面無變化
- 防跨目錄設置
- input
- 系統目錄
- 自動生成的文件以及目錄
- 類自動加載
- url生成
- 數據增刪改查
- 增加數據
- 數據更新
- 數據刪除
- 數據查詢
- 架構
- 生命周期
- 入口文件
- URL訪問規則
- 配置
- 默認慣例配置配置
- 初始應用配置
- 路由
- 域名路由
- URL生成
- 數據庫操作
- 方法列表
- 連接數據庫
- 分布式數據庫
- 查詢構造器
- 查詢數據
- 添加數據
- 更新數據
- 刪除數據
- 查詢語法
- 聚合查詢(統計)
- 時間查詢
- 高級查詢
- 視圖查詢
- 子查詢
- 輔助查詢之鏈式操作
- where
- table
- alias
- field
- order
- limit
- page
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- bind
- partition
- strict
- failException
- sequence(pgsql專用)
- 查詢事件
- 事務操作
- 監聽SQL
- 存儲過程
- 數據集
- 控制器
- 跳轉和重定向
- 空控制器和空操作
- 分層控制器
- Rest控制器
- 資源控制器
- 自動定位控制器
- tp3的增刪改查
- 方法注入
- 模型
- 屬性方法一覽
- 類方法詳解
- Model
- 調用model不存在的屬性
- 調用model中不存在的方法
- 調用model中不存在的靜態方法
- hasOne
- belongsTo
- hasMany {Relation}
- belongsToMany
- hasManyThrough
- morphMany
- morphOne
- morphTo
- ::hasWhere {Query}
- ::has
- relationCount
- data 【model】
- setInc {integer|true}
- setDec {integer|true}
- save {integer | false}
- saveAll {array}
- delete {integer}
- ::get 查詢單條數據 {Model}
- ::all 查詢多條數據{Model [ ]}
- ::create 新增單條數據 {Model}
- ::update 更新單條數據 {Model}
- ::destroy {integer}
- ::scope {Query}
- getAttr {mixed}
- xxx
- append
- appendRelationAttr
- hidden
- visible
- except
- readonly
- auto
- together
- allowField
- isUpdate
- validate
- toCollection
- toJson
- toArray
- 定義
- 新增
- 更新
- 查詢
- 刪除
- 聚合
- 獲取器
- 修改器
- 時間戳
- 只讀字段
- 軟刪除
- 類型轉換
- 數據完成
- 查詢范圍
- 模型分層
- 數組訪問和轉換
- JSON序列化
- 事件
- 關聯
- 一對一關聯
- 主表一對一關聯
- 從表一對一關聯(相對關聯)
- 一對多關聯
- 主表定義一對多關聯
- 從表定義一對多關聯
- 遠程一對多
- 多對多關聯
- 多態關聯
- 動態屬性
- 關聯預載入with()
- 關聯統計
- N+1查詢
- 聚合模型
- Model方法集合
- 表單驗證
- 驗證器
- 驗證規則
- 錯誤信息
- 驗證場景
- 控制器驗證
- 模型驗證
- 內置規則
- 靜態調用
- 表單令牌
- Token身份令牌
- 視圖
- 模版
- 變量輸出
- 函數輸出
- Request請求參數
- 模板注釋及原樣輸出
- 三元運算
- 內置標簽
- 模板繼承
- 模板布局
- 日志
- 日志初始化
- 日志驅動
- 日志寫入
- 獨立日志
- 日志清空
- 寫入授權
- 自定義日志
- 錯誤和調試
- 異常
- php系統異常及thinkphp5異常機制
- 異常處理
- 拋出異常
- 異常封裝
- resful
- 404頁面
- 調試模式
- Trace調試
- SQL調試
- 變量調試
- 性能調試
- 遠程調試
- 安全
- 輸入安全
- 數據庫安全
- 上傳安全
- 其它安全建議
- xss過濾
- 擴展
- 函數
- 類庫
- 行為
- 驅動
- Composer包
- Time
- 數據庫遷移工具
- Workerman
- MongoDb
- htmlpurifier XSS過濾
- 新浪SAE
- oauth2.0
- 命令行及生成文件
- 系統現成命令
- 創建類庫文件
- 生成類庫映射文件
- 生成路由緩存
- 清除緩存文件
- 生成配置緩存文件
- 生成數據表字段緩存
- 自定義命令行
- 開始
- 調用命令
- 雜項
- 助手函數
- URL重寫
- 緩存
- 緩存總結
- Session
- Cookie
- 多語言
- 分頁
- 上傳
- 驗證碼
- 圖像處理
- 文件處理
- 單元測試
- 自定義表單令牌