以前我寫過一篇如何少寫PHP "爛"代碼 https://segmentfault.com/a/11...
感受不少新人對此不太理解。今天以打卡功能爲例,去講解其中的奧祕。那篇文章講過代碼開發的過程當中分幾種類型。segmentfault
Route -> Controller -> Service -> Action
Route -> Controller -> Service -> Repository
通過屢次實際開發驗證後,發現Repository徹底是屢次一舉。因此在這裏更正下,取消Repository。api
Route -> Controller -> Service
需求是這樣的,用戶天天打卡得到積分,積分計入用戶帳戶,而且需記錄用戶積分的獲取及消費狀況。如圖所示,請求到控制器後,經過控制器去調用服務,服務又調用建立用戶打卡模塊完成打開,在用戶打卡過程當中對用戶帳戶積分進行變動及記錄用戶積分獲取記錄。架構
CREATE TABLE `member_attendance` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `member_id` int(11) NOT NULL COMMENT '用戶編碼', `status` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '1簽到成功', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `wallet` ( `user_id` bigint(20) NOT NULL COMMENT '用戶標示', `balance` decimal(12,2) NOT NULL COMMENT '錢包餘額', `integral` decimal(12,2) NOT NULL DEFAULT '0', `add_time` int(11) NOT NULL COMMENT '添加時間', `update_time` int(11) NOT NULL COMMENT '更改時間', UNIQUE KEY `wallet_user_id_unique` (`user_id`), KEY `wallet_user_id_index` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `member_integral_detail` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `member_id` int(11) NOT NULL COMMENT '用戶編碼', `title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '來源或消費', `integral` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '積分數', `type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '類型 0收入 -1支出', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
$api->post ('user/attendance','UserController@attendance');
public function attendance() { $result = $this->userService->attendance ($this->request); if ($result) { return $this->response->array (Response::return (200, '打卡成功')); } return $this->response->array (Response::return (0, "打卡失敗或已打卡")); }
public function attendance($request) { return (new CreateUserAttendance())->execute ($request); }
public function issetToday($userId) { $result = MemberAttendance::where ([ ['member_id', '=', $userId], ]) ->whereDate ('created_at', date ('Y-m-d', time ())) ->exists (); return $result; } // -------------------- 上述是下方issetToday方法,寫在MemberModel中 class CreateUserAttendance { public function execute($data) { if ((new MemberAttendance())->issetToday ($data->user_id)) { return false; } $models = new MemberAttendance(); $models->member_id = $data->user_id; $models->status = (string)"1"; $result = $models->save (); if ($result) { (new CreateUserIntegralDetail())->execute ($data->user_id, '打卡', 10, 0); return true; } return false; } }
interface integralDetail { public function execute($userId, $title, $integral, $type); } class CreateUserIntegralDetail extends UpdateUserWalletIntegral implements integralDetail { public function execute($userId, $title, $integral, $type) { parent::exec ($userId, $integral, $type); $models = new MemberIntegralDetail(); $models->member_id = $userId; $models->title = $title; $models->integral = $integral; $models->type = $type; return $models->save (); } }
上述代碼繼承了更新用戶積分的動做,在每次打卡成功後,咱們調用父類方法直接更新用戶積分。post
class UpdateUserWalletIntegral { public function exec($userId, $integral, $type) { if ($type == 0) { Wallet::where (['user_id', '=', $userId])->increment ('integral', $integral); } else { Wallet::where (['user_id', '=', $userId])->decrement ('integral', $integral); } } }
感謝你看到這裏,但願本篇文章能夠幫到你。有什麼問題可在下方評論區留言。謝謝🙏this