## 讀取器
前面讀取用戶生日的時候,使用了`date`方法進行日期的格式處理輸出,但是每次讀取數據后都需要這樣處理就顯得非常麻煩。
使用讀取器功能就可以簡化類似的數據處理操作,例如,我們給`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">model</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</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">Model</span></span>{
<span class="hljs-comment">// birthday讀取器</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getBirthdayAttr</span><span class="hljs-number">(<span class="hljs-regexp">$birthday</span>)</span></span>{
<span class="hljs-keyword">return</span> date(<span class="hljs-string">'Y-m-d'</span>, <span class="hljs-regexp">$birthday</span>);
}
}</span>
```
```
這里,我們添加了一個`getBirthdayAttr`讀取器方法用于讀取`User`模型的`birthday`屬性的值,該方法會在讀取birthday屬性值的時候自動執行。
讀取器方法的命名規范是:
> ### get + 屬性名的駝峰命名+ Attr
所以,`getBirthdayAttr`讀取器讀取的是`birthday`屬性,而`getUserBirthdayAttr` 讀取器讀取的則是`user_birthday`屬性。
定義完修改器后,修改控制器的`read`操作方法如下:
```
<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">read</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>=<span class="hljs-string">''</span>)</span></span>{
<span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>);
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->email . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->birthday . <span class="hljs-string">'<br/>'</span>;
}
```
```
訪問URL地址
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/user/1</span>
```
```
最后的輸出結果為:
```
<pre class="calibre18">
```
流年
thinkphp@qq.com
<span class="hljs-number">1977</span>-<span class="hljs-number">03</span>-<span class="hljs-number">05</span>
```
```
讀取器還可以定義讀取數據表中不存在的屬性,例如把原始生日和轉換的格式分開兩個屬性`birthday`和`user_birthday`,我們只需定義`user_birthday`屬性的讀取器方法:
```
<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">model</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</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">Model</span></span>{
<span class="hljs-comment">// user_birthday讀取器</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getUserBirthdayAttr</span><span class="hljs-number">(<span class="hljs-regexp">$value</span>,<span class="hljs-regexp">$data</span>)</span></span>{
<span class="hljs-keyword">return</span> date(<span class="hljs-string">'Y-m-d'</span>, <span class="hljs-regexp">$data</span>[<span class="hljs-string">'birthday'</span>]);
}
}</span>
```
```
這里的讀取器方法使用了第二個參數,表示傳入所有的屬性數據。因為原始的`user_birthday`屬性數據是不存在的,所以我們需要通過`data`參數獲取。
read操作方法修改為:
```
<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">read</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>=<span class="hljs-string">''</span>)</span></span>{
<span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>);
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->email . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->birthday . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->user_birthday . <span class="hljs-string">'<br/>'</span>;
}
```
```
當刷新頁面的時候,最終輸出的結果為:
```
<pre class="calibre18">
```
流年
thinkphp@qq.com
<span class="hljs-number">226339200</span><span class="hljs-number">1977</span>-<span class="hljs-number">03</span>-<span class="hljs-number">05</span>
```
```
## 修改器
由于`birthday`屬性是時間戳(整型)格式的,因此我們必須在寫入數據前進行時間戳轉換,前面使用的方法是每次賦值的時候進行轉換處理:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$user</span>[<span class="hljs-string">'birthday'</span>] = strtotime(<span class="hljs-string">'2015-04-02'</span>);
```
```
為了避免每次都進行日期格式的轉換操作,可以定義修改器方法來自動處理,修改`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">model</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</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">Model</span></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">getUserBirthdayAttr</span><span class="hljs-number">(<span class="hljs-regexp">$birthday</span>, <span class="hljs-regexp">$data</span>)</span></span>{
<span class="hljs-keyword">return</span> date(<span class="hljs-string">'Y-m-d'</span>, <span class="hljs-regexp">$data</span>[<span class="hljs-string">'birthday'</span>]);
}
<span class="hljs-comment">// birthday修改器</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setBirthdayAttr</span><span class="hljs-number">(<span class="hljs-regexp">$value</span>)</span></span>{
<span class="hljs-keyword">return</span> strtotime(<span class="hljs-regexp">$value</span>);
}
}</span>
```
```
修改器方法的命名規范是:
> ### set + 屬性名的駝峰命名+ Attr
所以,`setBirthdayAttr`方法修改的是`birthday`屬性,而`setUserBirthdayAttr` 方法修改的則是`user_birthday`屬性。
控制器的`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-regexp">$user</span>->nickname = <span class="hljs-string">'流年'</span>;
<span class="hljs-regexp">$user</span>->email = <span class="hljs-string">'thinkphp@qq.com'</span>;
<span class="hljs-regexp">$user</span>->birthday = <span class="hljs-string">'1977-03-05'</span>;
<span class="hljs-keyword">if</span> (<span class="hljs-regexp">$user</span>->save()) {
<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();
}
}
```
```
訪問URL地址:
```
<pre class="calibre18">
```
http://tp5.com/<span class="hljs-operator">user</span>/<span class="hljs-operator">add</span>
```
```
最后的輸出結果為:
```
<pre class="calibre18">
```
用戶<span class="hljs-operator">[ 流年:10 ]</span>新增成功
```
```
接著我們訪問
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/user/10</span>
```
```
頁面輸出結果為:
```
<pre class="calibre18">
```
流年
thinkphp@qq.com
<span class="hljs-number">1977</span>-<span class="hljs-number">03</span>-<span class="hljs-number">05</span>
```
```
通過定義修改器和讀取器,完成了時間戳方式存儲的`birthday`屬性的寫入和讀取的自動處理。
- 脕茫隆壟脨貌脩脭
- 脕茫隆壟脨貌脩脭
- 脪祿隆壟祿霉麓隆
- 脪祿隆壟祿霉麓隆
- 露鎂隆壟URL潞脥脗路脫脡
- 露鎂隆壟URL潞脥脗路脫脡
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脣脛隆壟脢媒戮脻驢芒
- 脣脛隆壟脢媒戮脻驢芒
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脕霉隆壟脛攏脨脥潞脥鹿脴脕陋
- 攏簍1攏漏脛攏脨脥露簍脪氓
- 攏簍2攏漏祿霉麓隆虜脵脳梅
- 攏簍3攏漏露脕脠隆脝梅潞脥脨脼賂脛脝梅
- 攏簍4攏漏脌脿脨脥脳陋祿祿潞脥脳脭露爐脥錨魯脡
- 攏簍5攏漏虜茅脩爐路露脦摟
- 攏簍6攏漏脢盲脠毛潞脥脩茅脰隴
- 攏簍7攏漏鹿脴脕陋
- 攏簍8攏漏脛攏脨脥脢盲魯枚
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 戮脜隆壟API驢陋路壟
- 戮脜隆壟API驢陋路壟
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬露鎂隆壟脭脫脧卯
- Cookie
- Session
- 碌樓脭陋虜芒脢脭
- 脥錄脧帽麓婁脌鉚
- 脦脛錄鎂脡脧麓蘆
- 脩茅脰隴脗毛
- 賂陸脗錄
- A隆壟魯攏錄沒脦脢脤芒錄爐
- B隆壟3.2潞脥5.0脟酶鹵冒
- C隆壟脰煤脢脰潞爐脢媒
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝