【小(xiǎo)編推薦】ThinkPHP3.2——自(zì)動完成

2014-06-26  &n•‍↕bsp;|   發布者:梁國(₽₩β‌guó)芳   |&nbs¥€¥p;  查看(kàn):3320次

Thinkphp

自(zì)動完成是(shì)ThinkPH↔​¥☆P提供用(yòng)來(lái)完成數(shù)據₩αφ自(zì)動處理(lǐ)和(hé)過濾的(de)方法,使用(yòα ≤ng)create方法創建數(shù)據對(duì)象的(de)時(s₩☆€₩hí)候會(huì)自(zì)動完成數(shù)據處理(lǐ)。

因此,在ThinkPHP使用(yòng)create方法來(±​ lái)創建數(shù)據對(duì)象是(shì)£♦★更加安全的(de)方式,而不(bù)是(shì)直接通(tōng)過a→®♣‍dd或者save方法實現(xiàn)數(shù)據"™寫入。

規則定義

自(zì)動完成通(tōng)常用(yòng)來(lái)完成默認字段←¶§寫入,安全字段過濾以及業(yè)務邏輯的(de)自(zì)動處♣≠♣理(lǐ)等,和(hé)自(zì)動驗證的(de)定義方式類似,自¶φ(zì)動完成的(de)定義也(yě)支持靜(jìng)态定義和(hé)動态"‍δ定義兩種方式。

  1. 靜(jìng)态方式:在模型類裡(lǐ)面通(tōng)過$_auto屬∏Ω↑₩性定義處理(lǐ)規則。
  2. 動态方式:使用(yòng)模型類的(de)auto方法動★​态創建自(zì)動處理(lǐ)規則。

兩種方式的(de)定義規則都(dōu)采用(yòng):↓'↔"

  1. array(
  2. array(完成字段1,完成規則,[完成條件(jiàn),附加規則]),
  3. array(完成字段2,完成規則,[完成條件(jiàn),附加規則←♠λ]),
  4. ......
  5. );

說(shuō)明(míng)

完成字段(必須)

需要(yào)進行(xíng)處理(lǐ)的(de)數(shù)據表γδ 實際字段名稱。

完成規則(必須)

需要(yào)處理(lǐ)的(de)規則,配合附加規則完成。

完成時(shí)間(jiān)(可(kě)選)

設置自(zì)動完成的(de)時(shí)間(jiān),包括:

設置 說(shuō)明(míng)
self::MODEL_INSERT或者1 新增數(shù)據的(de)時(shí)候處理(lǐ)(默認)
self::MODEL_UPDATE或者α→2 更新數(shù)據的(de)時(shí)候處理(lǐ↕​±α)
self::MODEL_BOTH或者3 所有(yǒu)情況都(dōu)進行(xíng)處理(lǐ)
附加規則(可(kě)選)

包括:

規則 說(shuō)明(míng)
function 使用(yòng)函數(shù),表示填充的(de)內≥÷‌≥(nèi)容是(shì)一(yī)個(gè)函數§λ≥γ(shù)名
callback 回調方法 ,表示填充的(de)內(nèi)容是(shì)一(yīα↓$☆)個(gè)當前模型的(de)方法
field 用(yòng)其它字段填充,表示填充的(d‌>e)內(nèi)容是(shì)一(yī)個(g← è)其他(tā)字段的(de)值
string 字符串(默認方式)
ignore 為(wèi)空(kōng)則忽略(3.1.2新增)

靜(jìng)态定義

預先在模型類裡(lǐ)面定義好(hǎo)自(zì)動完成的₩©∑(de)規則,我們稱之為(wèi)靜(jìng)态定義。例✘γα如(rú),我們在模型類定義_auto屬性:

  1. namespace Home\Model;
  2. use Think\Model;
  3. class UserModel extends Model{
  4. protected $_auto = array (
  5. array('status','1'), // 新增的(de)時(shí)候把status‍₽•字段設置為(wèi)1
  6. array('password','md5',3,'function') , // 對(duì)password字段在新增和(×¶hé)編輯的(de)時(shí)候使md5函數(shù)處理(lǐ) ↕∏
  7. array('name','getName',3,'callback'), // 對(duì)name字段在新增和(hé)編輯的(de)時(↔δ∞♦shí)候回調getName方法
  8. array('update_time','time',2,'function'), // 對(duì)update_time字段在更新的(de)時(≤λshí)候寫入當前時(shí)間(jiān∏♦→π)戳
  9. );
  10. }

然後,就(jiù)可(kě)以在使用(yòng)create方法創建數 Ω(shù)據對(duì)象的(de)時(s≥±✘hí)候自(zì)動處理(lǐ):

  1. $User = D("User"); // 實例化(huà)User對(duì↕'‌<)象
  2. if (!$User->create()){ // 創建數(shù)據對(duì)象
  3. // 如(rú)果創建失敗 表示驗證沒有(yǒεβγu)通(tōng)過 輸出錯(cuò)誤提示信息
  4. exit($User->getError());
  5. }else{
  6. // 驗證通(tōng)過 寫入新增數(shù)據
  7. $User->add();
  8. }

如(rú)果你(nǐ)沒有(yǒu)定義σ↕β任何自(zì)動驗證規則的(de)話(huà),則不δ∑•×(bù)需要(yào)判斷create方法的(de)返回值:

  1. $User = D("User"); // 實例化(huà)User對(duì)象
  2. $User->create(); // 生(shēng)成數(shù)據對(duì)象‍♣✘
  3. $User->add(); // 新增用(yòng)戶數(shù)據

或者更簡單的(de)使用(yòng):

  1. $User = D("User"); // 實例化(huà)User對(duì)象
  2. $User->create()->add(); // 生(shēng)成數(shù)據對(duì)象并寫入數(shù)據

create方法默認情況下(xià)是(sh뮣↕ì)根據表單提交的(de)post數(shù)據生(shēng) ≤ ×成數(shù)據對(duì)象,我們也(yě)可(kě≤→∑±)以根據其他(tā)的(de)數(shù)據源來(láλ$ i)生(shēng)成數(shù)據對(duì)象,你(nǐ)也(yě σ←)可(kě)以明(míng)确指定當前創建的(de♥‍÷♦)數(shù)據對(duì)象自(zì)動處理(lǐ)的(de)時(s¶≈↓hí)間(jiān)是(shì)新增還(hái)是(shì)編輯±Ω₽π數(shù)據,例如(rú):

  1. $User = D("User"); // 實例化(huà)User對(duì)象
  2. $userData = getUserData(); // 通(tōng)過方法獲取用(yòn¶Ω<≠g)戶數(shù)據
  3. $User->create($userData,2); // 根據userData數(shù)據創建數(shù)據對(duì)σ¥÷ε象,并指定為(wèi)更新數(shù)據
  4. $User->add();

create方法的(de)第二個(gè)參數(shù)就(jiù)用(yò'÷ng)于指定自(zì)動完成規則中的(de)完成♦♠™σ時(shí)間(jiān),也(yě)就(jiù)是(shβ♣∞✔ì)說(shuō)create方法的(de)自(zì)動處理(lǐ)規則隻γ✔λ會(huì)處理(lǐ)符合完成時(shí)間(jiān)的(de)自(z왩₽)動完成規則。 create方法在創建數(shù)據的(de)時(shíε©)候,已經自(zì)動過濾了(le)非數(shù)據表字段數(shù)據> 信息,因此不(bù)需要(yào)擔心表單會(huì)提交其他≠≠(tā)的(de)非法字段信息而導緻數(shù)據對(duì)象寫入出§©€錯(cuò),甚至還(hái)可(kě)以自(zì♣©)動過濾不(bù)希望用(yòng)戶在表單提交的(d★©‍€e)字段信息(詳見(jiàn)字段合法性過濾)。

3.1.2版本開(kāi)始新增了(le)ignore完成規則,這(zhè)一←♠₹π(yī)規則表示某個(gè)字段如(rú)果留空(kōng)的(de)話(hu¶>♦₩à)則忽略,通(tōng)常可(kě)用(yòng)于修改用(yòn£≠₹g)戶資料時(shí)候密碼的(de)輸入,定義如(r•βα∏ú)下(xià):

  1. array('password','',2,'ignore')

表示password字段編輯的(de)時(shí÷∞©)候留空(kōng)則忽略。

動态完成

除了(le)靜(jìng)态定義之外(wài),我們也(y‌​✘ ě)可(kě)以采用(yòng)動态完成的(de)方式來(lái±≤)解決不(bù)同的(de)處理(lǐ)規則。

  1. $rules = array (
  2. array('status','1'), // 新增的(de)時(shí)候把status字>÷段設置為(wèi)1
  3. array('password','md5',3,'function') , // 對(duì)password字段在新增☆β₽♥和(hé)編輯的(de)時(shí)候使md5函數(s"←hù)處理(lǐ)
  4. array('update_time','time',2,'function'), // 對(duì)update_time字段在更新的(de)時(shí∑£)候寫入當前時(shí)間(jiān)戳
  5. );
  6. $User = M('User');
  7. $User->auto($rules)->create()->add();

修改數(shù)據對(duì)象

在使用(yòng)create方法創建好(hǎo)數(shù)據對(d≤λuì)象之後,此時(shí)的(de)數(shù)據對₽÷'(duì)象保存在內(nèi)存中,因此仍然€α可(kě)以操作(zuò)數(shù)據對(duì)§∑↕象,包括修改或者增加數(shù)據對(duì)象的(de)值,例如(rú&✘×):

  1. $User = D("User"); // 實例化(huà)User對(duì)象
  2. $User->create(); // 生(shēng)成數(shù)據對(→‍♦ duì)象
  3. $User->status = 2; // 修改數(shù)據對(duì)象的(de)statγ ☆♣us屬性
  4. $User->register_time = NOW_TIME; // 增加register_time屬性
  5. $User->add(); // 新增用(yòng)戶數(shù)據

一(yī)旦調用(yòng)了(le)add方法(或者sa​£♣ve方法),創建在內(nèi)存中的(de)數(shù) ✘&'據對(duì)象就(jiù)會(huì)失★∞​效,如(rú)果希望創建好(hǎo)的(≠∑de)數(shù)據對(duì)象在後面的(de)數(s✘​hù)據處理(lǐ)中再次調用(yòng),可(kě)以 ©÷↓保存數(shù)據對(duì)象先,例如(rú):

  1. $User = D("User"); // 實例化(huà)User對(duì)象
  2. $data = $User->create(); // 保存生(shēng)成的(de)數(shù)據對(duì)象
  3. $User->add();

不(bù)過要(yào)記得(de),如(rú)果你(nǐ'♠♦)修改了(le)內(nèi)存中的(de)數(shù)據對(↔&duì)象并不(bù)會(huì)自(zì)動更新保存的(de)數(shù)據 δε 對(duì)象,因此下(xià)面的(de)用(yò←∞ng)法是(shì)錯(cuò)誤的(de):

  1. $User = D("User"); // 實例化(huà)User對(duì)象
  2. $data = $User->create(); // 保存生(shēng)成的(de)數(shù)據對(duì)象
  3. $User->status = 2; // 修改數(shù)據對(duì)象的(de)status屬性
  4. $User->register_time = NOW_TIME; // 增加register_time屬性
  5. $User->add($data);

上(shàng)面的(de)代碼我們修改了(le)數(β​≤λshù)據對(duì)象,但(dàn)是(shì≈φ )仍然寫入的(de)是(shì)之前保存的(dε&e)數(shù)據對(duì)象,因此對(duì)數(shù)據對(® duì)象的(de)更改操作(zuò)将會(huì♣Ω∞)無效。