現在我們來進一步使用表單提交數據完成模型的對象操作,主要內容包含:
- - [表單提交](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147289#u8868u5355u63D0u4EA4)
- [表單驗證](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147289#u8868u5355u9A8Cu8BC1)
- [錯誤提示](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147289#u9519u8BEFu63D0u793A)
- [自定義驗證規則](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147289#u81EAu5B9Au4E49u9A8Cu8BC1u89C4u5219)
- [控制器驗證](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147289#u63A7u5236u5668u9A8Cu8BC1)
## 表單提交
首先創建一個視圖模板文件 `application/index/view/user/create.html`,內容如下:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><!doctype html></span><span class="hljs-regexp"><<span class="hljs-operator">html</span>></span><span class="hljs-regexp"><<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">meta</span> <span class="hljs-operator">charset</span>=<span class="hljs-string">"UTF-8"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">title</span>></span>創建用戶<span class="hljs-regexp"></<span class="hljs-operator">title</span>></span><span class="hljs-regexp"><<span class="hljs-operator">style</span>></span><span class="css"><span class="hljs-regexp">body</span> <span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">font-family</span>:<span class="hljs-string"><span class="hljs-operator">"Microsoft Yahei"</span>,<span class="hljs-operator">"Helvetica Neue"</span>,Helvetica,Arial,sans-serif</span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"><span class="hljs-number">16px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"><span class="hljs-number">5px</span></span></span>;
}</span><span class="hljs-regexp">.form</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">15px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"> <span class="hljs-number">16px</span></span></span>;
}</span><span class="hljs-regexp">.form</span> <span class="hljs-regexp">.text</span> <span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">3px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">2px</span> <span class="hljs-number">10px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">width</span>:<span class="hljs-string"> <span class="hljs-number">240px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">height</span>:<span class="hljs-string"> <span class="hljs-number">24px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">line-height</span>:<span class="hljs-string"> <span class="hljs-number">28px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#D4D4D4</span></span></span>;
}</span><span class="hljs-regexp">.form</span> <span class="hljs-regexp">.btn</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">6px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">6px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">width</span>:<span class="hljs-string"> <span class="hljs-number">120px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"> <span class="hljs-number">16px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#D4D4D4</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">cursor</span>:<span class="hljs-string"> pointer</span></span>;
<span class="hljs-operator"><span class="hljs-title1">background</span>:<span class="hljs-string"><span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">a</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#868686</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">cursor</span>:<span class="hljs-string"> pointer</span></span>;
}</span><span class="hljs-operator"><span class="hljs-title1">a</span>:<span class="hljs-string">hover{
text-decoration: underline</span></span>;
}
<span class="hljs-regexp">h2</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#4288ce</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-weight</span>:<span class="hljs-string"> <span class="hljs-number">400</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">6px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"> <span class="hljs-number">6px</span> <span class="hljs-number">0</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"> <span class="hljs-number">28px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-bottom</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">div</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">8px</span></span></span>;
}</span><span class="hljs-regexp">.info</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">12px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-bottom</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">.copyright</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin-top</span>:<span class="hljs-string"> <span class="hljs-number">24px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">12px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-top</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span></span><span class="hljs-regexp"></<span class="hljs-operator">style</span>></span><span class="hljs-regexp"></<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">body</span>></span><span class="hljs-regexp"><<span class="hljs-operator">h2</span>></span>創建用戶<span class="hljs-regexp"></<span class="hljs-operator">h2</span>></span><span class="hljs-regexp"><<span class="hljs-operator">FORM</span> <span class="hljs-operator">method</span>=<span class="hljs-string">"post"</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"form"</span> <span class="hljs-operator">action</span>=<span class="hljs-string">"{:url('index/user/add')}"</span>></span>
昵 稱:<span class="hljs-regexp"><<span class="hljs-operator">INPUT</span> <span class="hljs-operator">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"text"</span> <span class="hljs-operator">name</span>=<span class="hljs-string">"nickname"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span>
郵 箱:<span class="hljs-regexp"><<span class="hljs-operator">INPUT</span> <span class="hljs-operator">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"text"</span> <span class="hljs-operator">name</span>=<span class="hljs-string">"email"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span>
生 日:<span class="hljs-regexp"><<span class="hljs-operator">INPUT</span> <span class="hljs-operator">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"text"</span> <span class="hljs-operator">name</span>=<span class="hljs-string">"birthday"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span><span class="hljs-regexp"><<span class="hljs-operator">input</span> <span class="hljs-operator">type</span>=<span class="hljs-string">"hidden"</span> <span class="hljs-operator">name</span>=<span class="hljs-string">"__token__"</span> <span class="hljs-operator">value</span>=<span class="hljs-string">"{$Request.token}"</span> /></span><span class="hljs-regexp"><<span class="hljs-operator">INPUT</span> <span class="hljs-operator">type</span>=<span class="hljs-string">"submit"</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"btn"</span> <span class="hljs-operator">value</span>=<span class="hljs-string">" 提交 "</span>></span><span class="hljs-regexp"></<span class="hljs-operator">FORM</span>></span><span class="hljs-regexp"><<span class="hljs-operator">div</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"copyright"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">a</span> <span class="hljs-operator">title</span>=<span class="hljs-string">"官方網站"</span> <span class="hljs-operator">href</span>=<span class="hljs-string">"http://www.thinkphp.cn"</span>></span>ThinkPHP<span class="hljs-regexp"></<span class="hljs-operator">a</span>></span><span class="hljs-regexp"><<span class="hljs-operator">span</span>></span>V5<span class="hljs-regexp"></<span class="hljs-operator">span</span>></span><span class="hljs-regexp"><<span class="hljs-operator">span</span>></span>{ 十年磨一劍-為API開發設計的高性能框架 }<span class="hljs-regexp"></<span class="hljs-operator">span</span>></span><span class="hljs-regexp"></<span class="hljs-operator">div</span>></span><span class="hljs-regexp"></<span class="hljs-operator">body</span>></span><span class="hljs-regexp"></<span class="hljs-operator">html</span>></span>
```
```
User控制器增加新的操作方法`create`如下:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 創建用戶數據頁面</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">create</span><span class="hljs-number">()</span></span>{
<span class="hljs-keyword">return</span> view();
}
```
```
`view`方法是系統封裝的助手函數用于快速渲染模板文件,這里沒有傳入模板文件,則按照系統默認的解析規則會自動渲染當前操作方法對應的模板文件,也就是默認視圖目錄(`application/index/view`)下面的`user/create.html`文件,所以如果改成下面的方式是相同的:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 創建用戶數據頁面</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">create</span><span class="hljs-number">()</span></span>{
<span class="hljs-keyword">return</span> view(<span class="hljs-string">'user/create'</span>);
}
```
```
并且修改之前的`add`方法如下:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 新增用戶數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$user</span> = <span class="hljs-keyword">new</span> UserModel;
<span class="hljs-keyword">if</span> (<span class="hljs-regexp">$user</span>->allowField(<span class="hljs-keyword">true</span>)->save(input(<span class="hljs-string">'post.'</span>))) {
<span class="hljs-keyword">return</span> <span class="hljs-string">'用戶[ '</span> . <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">':'</span> . <span class="hljs-regexp">$user</span>->id . <span class="hljs-string">' ]新增成功'</span>;
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$user</span>->getError();
}
}
```
```
> #### 注意
>
> - - - - - -
>
> 這里使用`allowField(true)`是為了避免表單令牌驗證的字段被寫入數據表,如果你已經在模型里面定義了field屬性的話,可以不需要。
我們訪問URL地址:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/user/create</span>
```
```
頁面輸出如圖:

輸入用戶信息后,點擊提交按鈕:

頁面顯示結果為:
```
<pre class="calibre18">
```
用戶<span class="hljs-operator">[ 流年:30 ]</span>新增成功
```
```
## 表單驗證
永遠不要相信用戶的數據,所以現在給表單提交添加數據驗證。
我們添加一個`User`驗證器,如下:
```
<pre class="calibre18">
```
<?php
namespace app\index\validate;
use think\<span class="hljs-operator">Validate</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Validate</span></span>{
<span class="hljs-comment">// 驗證規則</span><span class="hljs-keyword">protected</span> $rule = [
<span class="hljs-operator">'nicknam</span>e' => <span class="hljs-operator">'require</span>|min:<span class="hljs-number">5</span>|token',
<span class="hljs-operator">'emai</span>l' => <span class="hljs-operator">'require</span>|email',
<span class="hljs-operator">'birthda</span>y' => <span class="hljs-operator">'dateFormat</span>:<span class="hljs-operator">Y</span>-m-d',
];
}
```
```
`User`驗證器添加了三個屬性的驗證規則,分別表示:
- 昵稱必須,而且最小長度為5
- 郵箱必須,而且必須是合法的郵件地址
- 生日可選,如果填寫的話必須為 `Y-m-d`格式的日期格式
對屬性可以使用多個驗證規則,除非使用了`require`開頭的規則,否則所有的驗證都是可選的(也就是說有值才驗證),多個驗證之間用`|`分割,并且按照先后順序依次進行驗證,一旦某個規則驗證失敗,后續的規則就不會再進行驗證(除非設置批量驗證方式則統一返回所有的錯誤信息)。
更多的內置規則可以參考完全開發手冊的[內置規則](http://www.hmoore.net/manual/thinkphp5/129356)一節。
如果我們的驗證規則里面使用了`|`,為了避免混淆則必須用數組方式定義驗證規則,驗證規則定義修改如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">validate</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Validate</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Validate</span></span>{
<span class="hljs-comment">// 驗證規則</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$rule</span> = [
<span class="hljs-string">'nickname'</span> => [<span class="hljs-string">'require'</span>, <span class="hljs-string">'min'</span>=><span class="hljs-number">5</span>, <span class="hljs-string">'token'</span>],
<span class="hljs-string">'email'</span> => [<span class="hljs-string">'require'</span>, <span class="hljs-string">'email'</span>],
<span class="hljs-string">'birthday'</span> => [<span class="hljs-string">'dateFormat'</span> => <span class="hljs-string">'Y|m|d'</span>],
];
}</span>
```
```
然后對控制器的`add`方法則稍加修改,在`save`方法之前添加一個`validate`方法即可:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 新增用戶數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$user</span> = <span class="hljs-keyword">new</span> UserModel;
<span class="hljs-keyword">if</span> (<span class="hljs-regexp">$user</span>->allowField(<span class="hljs-keyword">true</span>)->validate(<span class="hljs-keyword">true</span>)->save(input(<span class="hljs-string">'post.'</span>))) {
<span class="hljs-keyword">return</span> <span class="hljs-string">'用戶[ '</span> . <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">':'</span> . <span class="hljs-regexp">$user</span>->id . <span class="hljs-string">' ]新增成功'</span>;
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$user</span>->getError();
}
}
```
```
當我們沒有輸入任何表單數據就直接提交的話,頁面會輸出結果:
```
<pre class="calibre18">
```
nickname不能為空
```
```
當我們輸入昵稱為`wo`的時候點擊提交

頁面輸出結果為:
```
<pre class="calibre18">
```
nickname長度不能小于 <span class="hljs-number">5</span>
```
```
當輸入一個錯誤的郵箱格式后提交

頁面提示錯誤信息為:
```
<pre class="calibre18">
```
email格式不符
```
```
當輸入一個 1990/08/09 的生日時候

頁面提示的錯誤信息是:
```
<pre class="calibre18">
```
birthday必須使用日期格式:Y-m<span class="hljs-operator">-d</span>
```
```
## 錯誤提示
目前為止,提示的錯誤信息都是系統默認的,接下來我們來定義提示信息。
首先,如果只是希望修改屬性名稱的話,可以直接使用下面的驗證規則定義方式:
```
<pre class="calibre18">
```
<?php
namespace app\index\validate;
use think\<span class="hljs-operator">Validate</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Validate</span></span>{
<span class="hljs-comment">// 驗證規則</span><span class="hljs-keyword">protected</span> $rule = [
<span class="hljs-operator">'nickname</span>|昵稱' => <span class="hljs-operator">'require</span>|min:<span class="hljs-number">5</span>',
<span class="hljs-operator">'email</span>|郵箱' => <span class="hljs-operator">'require</span>|email',
<span class="hljs-operator">'birthday</span>|生日' => <span class="hljs-operator">'dateFormat</span>:<span class="hljs-operator">Y</span>-m-d',
];
}
```
```
現在我們提交一個錯誤的郵箱,

提示的錯誤信息為:
```
<pre class="calibre18">
```
郵箱格式不符
```
```
輸入錯誤的生日格式的時候,提示的錯誤信息為:
```
<pre class="calibre18">
```
生日必須使用日期格式:Y-m<span class="hljs-operator">-d</span>
```
```
如果希望完整定義錯誤提示信息的話,可以使用:
```
<pre class="calibre18">
```
<?php
namespace app\index\validate;
use think\<span class="hljs-operator">Validate</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Validate</span></span>{
<span class="hljs-comment">// 驗證規則</span><span class="hljs-keyword">protected</span> $rule = [
[<span class="hljs-operator">'nicknam</span>e', <span class="hljs-operator">'require</span>|min:<span class="hljs-number">5</span>', '昵稱必須|昵稱不能短于<span class="hljs-number">5</span>個字符'],
[<span class="hljs-operator">'emai</span>l', <span class="hljs-operator">'emai</span>l', '郵箱格式錯誤'],
[<span class="hljs-operator">'birthda</span>y', <span class="hljs-operator">'dateFormat</span>:<span class="hljs-operator">Y</span>-m-d', '生日格式錯誤'],
];
}
```
```
現在我們提交一個錯誤的郵箱,提示的錯誤信息為:
```
<pre class="calibre18">
```
郵箱格式錯誤
```
```
提交一個錯誤的生日格式后,提示的錯誤信息變成:
```
<pre class="calibre18">
```
生日格式錯誤
```
```
系統提供了豐富的內置驗證規則,具體可以參考完全開發手冊。
## 自定義驗證規則
系統的驗證規則可以滿足大部分的驗證場景,但有時候我們也需要自定義特殊的驗證規則,例如我們需要驗證郵箱必須為`thinkphp.cn`域名的話,可以在`User`驗證器中添加驗證規則如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">validate</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Validate</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Validate</span></span>{
<span class="hljs-comment">// 驗證規則</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$rule</span> = [
[<span class="hljs-string">'nickname'</span>, <span class="hljs-string">'require|min:5'</span>, <span class="hljs-string">'昵稱必須|昵稱不能短于5個字符'</span>],
[<span class="hljs-string">'email'</span>, <span class="hljs-string">'checkMail:thinkphp.cn'</span>, <span class="hljs-string">'郵箱格式錯誤'</span>],
[<span class="hljs-string">'birthday'</span>, <span class="hljs-string">'dateFormat:Y-m-d'</span>, <span class="hljs-string">'生日格式錯誤'</span>],
];
<span class="hljs-comment">// 驗證郵箱格式 是否符合指定的域名</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">checkMail</span><span class="hljs-number">(<span class="hljs-regexp">$value</span>, <span class="hljs-regexp">$rule</span>)</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-number">1</span> === preg_match(<span class="hljs-string">'/^\w+([-+.]\w+)*@'</span> . <span class="hljs-regexp">$rule</span> . <span class="hljs-string">'$/'</span>, <span class="hljs-regexp">$value</span>);
}
}</span>
```
```
自定義驗證規則也支持返回動態的錯誤信息,只需要在驗證方法里面返回錯誤信息字符串即可,例如:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">validate</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Validate</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Validate</span></span>{
<span class="hljs-comment">// 驗證規則</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$rule</span> = [
[<span class="hljs-string">'nickname'</span>, <span class="hljs-string">'require|min:5'</span>, <span class="hljs-string">'昵稱必須|昵稱不能短于5個字符'</span>],
[<span class="hljs-string">'email'</span>, <span class="hljs-string">'checkMail:thinkphp.cn'</span>, <span class="hljs-string">'郵箱格式錯誤'</span>],
[<span class="hljs-string">'birthday'</span>, <span class="hljs-string">'dateFormat:Y-m-d'</span>, <span class="hljs-string">'生日格式錯誤'</span>],
];
<span class="hljs-comment">// 驗證郵箱格式 是否符合指定的域名</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">checkMail</span><span class="hljs-number">(<span class="hljs-regexp">$value</span>, <span class="hljs-regexp">$rule</span>)</span></span>{
<span class="hljs-regexp">$result</span> = preg_match(<span class="hljs-string">'/^\w+([-+.]\w+)*@'</span> . <span class="hljs-regexp">$rule</span> . <span class="hljs-string">'$/'</span>, <span class="hljs-regexp">$value</span>);
<span class="hljs-keyword">if</span> (!<span class="hljs-regexp">$result</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-string">'郵箱只能是'</span> . <span class="hljs-regexp">$rule</span> . <span class="hljs-string">'域名'</span>;
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
}
}
}</span>
```
```
如果輸入了一個不是`thinkphp.cn`域名的郵箱地址,會提示如下錯誤信息:
```
<pre class="calibre18">
```
郵箱只能是<span class="hljs-regexp">thinkphp</span><span class="hljs-regexp">.cn</span>域名
```
```
## 控制器驗證
前面我們講了在模型中使用驗證器進行數據驗證的方法,下面來講下如何在控制器中進行數據驗證。
驗證器類的定義不變,現在修改下控制器類:
```
<pre class="calibre18">
```
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>\<span class="hljs-title">User</span> <span class="hljs-title">as</span> <span class="hljs-title">UserModel</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span></span>{
<span class="hljs-comment">// 創建用戶數據頁面</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">create</span><span class="hljs-number">()</span></span>{
<span class="hljs-keyword">return</span> view();
}
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$data</span> = input(<span class="hljs-string">'post.'</span>);
<span class="hljs-comment">// 數據驗證</span><span class="hljs-regexp">$result</span> = <span class="hljs-regexp">$this</span>->validate(<span class="hljs-regexp">$data</span>,<span class="hljs-string">'User'</span>);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">true</span> !== <span class="hljs-regexp">$result</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$result</span>;
}
<span class="hljs-regexp">$user</span> = <span class="hljs-keyword">new</span> UserModel;
<span class="hljs-comment">// 數據保存</span><span class="hljs-regexp">$user</span>->allowField(<span class="hljs-keyword">true</span>)->save(<span class="hljs-regexp">$data</span>);
<span class="hljs-keyword">return</span> <span class="hljs-string">'用戶[ '</span> . <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">':'</span> . <span class="hljs-regexp">$user</span>->id . <span class="hljs-string">' ]新增成功'</span>;
}
}
```
```
然后訪問
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/user/create</span>
```
```
當輸入一個錯誤的郵箱格式后提交

頁面提示錯誤信息為:
```
<pre class="calibre18">
```
email格式不符
```
```
如果有一些個別的驗證沒有在驗證器里面定義,也可以使用靜態方法單獨處理,例如下面對birthday字段單獨驗證是否是一個有效的日期格式:
```
<pre class="calibre42">
```
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>\<span class="hljs-title">User</span> <span class="hljs-title">as</span> <span class="hljs-title">UserModel</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Validate</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span></span>{
<span class="hljs-comment">// 創建用戶數據頁面</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">create</span><span class="hljs-number">()</span></span>{
<span class="hljs-keyword">return</span> view();
}
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$data</span> = input(<span class="hljs-string">'post.'</span>);
<span class="hljs-comment">// 驗證birthday是否有效的日期</span><span class="hljs-regexp">$check</span> = Validate::is(<span class="hljs-regexp">$data</span>[<span class="hljs-string">'birthday'</span>],<span class="hljs-string">'date'</span>);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">false</span> === <span class="hljs-regexp">$check</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-string">'birthday日期格式非法'</span>;
}
<span class="hljs-regexp">$user</span> = <span class="hljs-keyword">new</span> UserModel;
<span class="hljs-comment">// 數據保存</span><span class="hljs-regexp">$user</span>->save(<span class="hljs-regexp">$data</span>);
<span class="hljs-keyword">return</span> <span class="hljs-string">'用戶[ '</span> . <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">':'</span> . <span class="hljs-regexp">$user</span>->id . <span class="hljs-string">' ]新增成功'</span>;
}
}
```
```
- 脕茫隆壟脨貌脩脭
- 脕茫隆壟脨貌脩脭
- 脪祿隆壟祿霉麓隆
- 脪祿隆壟祿霉麓隆
- 露鎂隆壟URL潞脥脗路脫脡
- 露鎂隆壟URL潞脥脗路脫脡
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脣脛隆壟脢媒戮脻驢芒
- 脣脛隆壟脢媒戮脻驢芒
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脕霉隆壟脛攏脨脥潞脥鹿脴脕陋
- 攏簍1攏漏脛攏脨脥露簍脪氓
- 攏簍2攏漏祿霉麓隆虜脵脳梅
- 攏簍3攏漏露脕脠隆脝梅潞脥脨脼賂脛脝梅
- 攏簍4攏漏脌脿脨脥脳陋祿祿潞脥脳脭露爐脥錨魯脡
- 攏簍5攏漏虜茅脩爐路露脦摟
- 攏簍6攏漏脢盲脠毛潞脥脩茅脰隴
- 攏簍7攏漏鹿脴脕陋
- 攏簍8攏漏脛攏脨脥脢盲魯枚
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 戮脜隆壟API驢陋路壟
- 戮脜隆壟API驢陋路壟
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬露鎂隆壟脭脫脧卯
- Cookie
- Session
- 碌樓脭陋虜芒脢脭
- 脥錄脧帽麓婁脌鉚
- 脦脛錄鎂脡脧麓蘆
- 脩茅脰隴脗毛
- 賂陸脗錄
- A隆壟魯攏錄沒脦脢脤芒錄爐
- B隆壟3.2潞脥5.0脟酶鹵冒
- C隆壟脰煤脢脰潞爐脢媒
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝