為了保證數(shù)據(jù)的原子性,建議最好一個(gè)邏輯(logic層)操作對(duì)應(yīng)一張表
如果你還不清楚整個(gè)網(wǎng)站的應(yīng)用目錄結(jié)構(gòu),再去看看再來(lái)進(jìn)行后續(xù)的操作。
再次強(qiáng)調(diào)一下目錄分層結(jié)構(gòu):
controller:控制器層,起控制轉(zhuǎn)發(fā)功能,不管邏輯
logic:邏輯層,主要處理邏輯、數(shù)據(jù)庫(kù)操作等
service:服務(wù)層,數(shù)據(jù)驗(yàn)證、事務(wù)處理、數(shù)據(jù)后期處理等操作
model:模型層,數(shù)據(jù)處理層(已經(jīng)封裝好,直接繼承于BaseModel),自動(dòng)完成,自動(dòng)修改等操作
validate:數(shù)據(jù)驗(yàn)證層,數(shù)據(jù)進(jìn)行curd操作的時(shí)候最好對(duì)數(shù)據(jù)進(jìn)行嚴(yán)格驗(yàn)證
view:視圖層
要插入數(shù)據(jù)所先得有自己的數(shù)據(jù)庫(kù),如果你已經(jīng)有了就不用創(chuàng)建了,例如我這里有一個(gè)用戶(hù)表
| 主鍵 | 用戶(hù)名 | 密碼 | | id | username | password |
主鍵設(shè)置為自動(dòng)遞增
在你的模塊controller里面創(chuàng)建User.php
<?php
namespace app\frontend\controller;
use \tpfcore\Core;
class User extends FrontendBase
{
public function add()
{
IS_POST && $this->jump(Core::loadModel($this->name)->saveUser($this->param));
return $this->fetch("add");
}
}
控制器里面相當(dāng)?shù)母蓛?,這里用到Core這個(gè)核心類(lèi),Core::loadModel($this->name)它就會(huì)自動(dòng)定位到相應(yīng)service層下面對(duì)應(yīng)的類(lèi)了,這里它就定位到service層下的User類(lèi),并調(diào)用它的saveUser方法
控制器說(shuō)明:
前端控制器都要繼承FrontendBase基類(lèi),訪基本又繼承ControllerBase類(lèi)
打開(kāi)FrontendBase你可以看到里面什么都沒(méi)有,為什么要繼承這個(gè)類(lèi),而不直接繼承ControllerBase類(lèi)?每因?yàn)閭€(gè)模塊在執(zhí)行之前可能要進(jìn)行一些不同的操作
在你的service模塊里面創(chuàng)建User.php
<?php // +---------------------------------------------------------------------- // | Author: yaoyihong <510974211@qq.com> // +---------------------------------------------------------------------- namespace app\frontend\service;
use app\common\service\ServiceBase;
use \tpfcore\Core;
/**
* 基礎(chǔ)服務(wù)
*/
class User extends FrontendBase
{
public function saveUser($data){
// 在進(jìn)行數(shù)據(jù)操作前進(jìn)行數(shù)據(jù)驗(yàn)證
$validate=\think\Loader::validate($this->name);
$validate_result = $validate->scene('add')->check($data);
if (!$validate_result) {
return [RESULT_ERROR, $validate->getError(), null];
}
return Core::loadModel($this->name)->saveObject($data);
}
}
這里面進(jìn)行的操作便是數(shù)據(jù)驗(yàn)證,邏輯調(diào)用,或后期數(shù)據(jù)處理等操作
在你的公共模塊logic里面創(chuàng)建User.php
<?php namespace app\frontend\logic; use \tpfcore\Core; class User extends FrontendBase { public function saveUser($data){ $result=self::saveObject($data); if($result){ return [RESULT_SUCCESS,"操作成功"]; } return [RESULT_ERROR,"操作失敗"]; } }
這里為什么要?jiǎng)?chuàng)建在公共模塊?目的就是想讓很多模塊能共用邏輯,我們以后要擴(kuò)展功能 的時(shí)候,少寫(xiě)重復(fù)的邏輯。
這里的添加就用了一句話(huà)self::saveObject($data);為什么這樣就能添加了呢?當(dāng)然我里面是封裝好了的,但是,添加的時(shí)候傳遞過(guò)來(lái)的參數(shù)是有要求的,<span style="color:#F00">必須跟數(shù)據(jù)庫(kù)里面的字段對(duì)應(yīng)</span>,例如這里的$data格式一定是下面這樣 的
array( 'username'=>"用戶(hù)名", 'password'=>"密碼的值" )
在你的模塊validate里面創(chuàng)建User.php
<?php namespace app\frontend\validate; class User extends FrontendBase { // 驗(yàn)證規(guī)則 protected $rule = [ 'username' => 'require', 'password' => 'require', ];
// 驗(yàn)證提示
protected $message = [
'username.require' => '用戶(hù)名必須',
'password.require' => '密碼必須',
];
// 應(yīng)用場(chǎng)景
protected $scene = [
'add' => ['username','password']
];
}
我這里就只能數(shù)據(jù)進(jìn)行了簡(jiǎn)單的驗(yàn)證,在邏輯層里面進(jìn)行簡(jiǎn)單的調(diào)用,指定驗(yàn)證場(chǎng)景,就會(huì)自動(dòng)進(jìn)行這里面的數(shù)據(jù)驗(yàn)證了,具體更詳細(xì)的驗(yàn)證規(guī)則請(qǐng)點(diǎn)擊https://www.kancloud.cn/manual/thinkphp5/129320進(jìn)行查看
視圖層我就簡(jiǎn)單的寫(xiě)一下,在theme/frontend/default新建立一個(gè)User文件夾,然后創(chuàng)建一個(gè)add.html文件,內(nèi)容如下
<!DOCTYPE html> <html> <head> <title>添加用戶(hù)</title> </head> <body> <form method="post" action="{:url('User/add')}"> <input type="text" name="username"/><br/> <input type="password" name="password"/><br/> <input type="submit" value="操作注冊(cè)"/> </form> </body> </html>
打開(kāi)瀏覽器訪問(wèn):http://你的域名/user/add測(cè)試一下效果
這里我沒(méi)有用到Model層,因?yàn)槲覜](méi)有用到數(shù)據(jù)自動(dòng)完成或數(shù)據(jù)自動(dòng)修改功能,以后我會(huì)用一個(gè)實(shí)例來(lái)補(bǔ)充它的用法
這就完成了數(shù)據(jù)的基本添加操作了
更多建議: