第一段yii2的代碼,功能是檢測使用者是否建立當天日誌。如果未建立,立即建立,並且儲存。
為了避免大量查詢資料庫,所以儲存到session中(可能不是很好?)。
歡迎指正其中的優缺點(邏輯是否正確):
#/models/log/DayLog.php#/models/log/DayLogInterface.php#/models/log/SystemLog.php#/models/log/MemberLog.php#/models/log/VistorLog.php
php#/models/log/DayLog.phpnamespace app\models\log;use yii\db\ActiveRecord;class DayLog extends ActiveRecord{ const SESSION_LOG_ID = 'x_day_id'; const SESSION_LOG_DATE = 'x_day_date'; public $allowFields = []; /** * @description 更新統計日誌 * * @param $id * @param $field * @param int $num * * @return bool */ public function updateLog($id, $field, $num = 1) { if (in_array($field, $this->allowFields)) { $s = self::findOne($id); if ($s) { return $s->updateCounters([$field => $num]); } } return false; } public function getLogId() { return \Yii::$app->session->get($this::SESSION_LOG_ID); } public function getLogDate() { return \Yii::$app->session->get($this::SESSION_LOG_DATE); } public function setLogId($id) { \Yii::$app->session->set($this::SESSION_LOG_ID, $id); } public function setLogDate($date) { \Yii::$app->session->set($this::SESSION_LOG_DATE, $date); } //退出的時候必須全部刪除 public function clean() { \Yii::$app->session->remove($this::SESSION_LOG_ID); \Yii::$app->session->remove($this::SESSION_LOG_DATE); }}
php#/models/log/DayLogInterface.phpnamespace app\models\log;interface DayLogInterface{ public function check();}
php#/models/log/MemberLog.phpnamespace app\models\log;use yii\base\Event;use yii\db\ActiveRecord;use yii\web\User;class MemberLog extends DayLog implements DayLogInterface{ const SESSION_LOG_ID = 'u_day_id'; // 日誌的儲存ID const SESSION_LOG_DATE = 'u_day_date'; //日誌中儲存的日期 YYYY-MM-dd public $allowFields = []; public static function tableName() { return '{{%daylog_member}}'; } public function check() { //如果不是GUEST檢查是否有日誌 if (!\Yii::$app->user->isGuest) { $logId = $this->getLogId(); $logDate = $this->getLogDate(); $today = date('Y-m-d'); if ($logId && $logDate == $today) { //當天日誌已經建立 } else { $row = self::find() ->where(['uid' => \Yii::$app->user->getId(), 'date' => $today]) ->one(); if ($row) { //資料庫中有當天記錄 $this->setLogId($row->id); $this->setLogDate($row->date); } else { $log = new self(); $log->date = $today; $log->uid = \Yii::$app->user->getId(); if ($log->save() && $log->id) { $this->setLogId($log->id); $this->setLogDate($log->date); } } } //綁定事件 登入前清空原有記錄 Event::on(User::className(), User::EVENT_BEFORE_LOGIN, [ActiveRecord::className(), 'clean']); } }}
回複內容:
第一段yii2的代碼,功能是檢測使用者是否建立當天日誌。如果未建立,立即建立,並且儲存。
為了避免大量查詢資料庫,所以儲存到session中(可能不是很好?)。
歡迎指正其中的優缺點(邏輯是否正確):
#/models/log/DayLog.php#/models/log/DayLogInterface.php#/models/log/SystemLog.php#/models/log/MemberLog.php#/models/log/VistorLog.php
php#/models/log/DayLog.phpnamespace app\models\log;use yii\db\ActiveRecord;class DayLog extends ActiveRecord{ const SESSION_LOG_ID = 'x_day_id'; const SESSION_LOG_DATE = 'x_day_date'; public $allowFields = []; /** * @description 更新統計日誌 * * @param $id * @param $field * @param int $num * * @return bool */ public function updateLog($id, $field, $num = 1) { if (in_array($field, $this->allowFields)) { $s = self::findOne($id); if ($s) { return $s->updateCounters([$field => $num]); } } return false; } public function getLogId() { return \Yii::$app->session->get($this::SESSION_LOG_ID); } public function getLogDate() { return \Yii::$app->session->get($this::SESSION_LOG_DATE); } public function setLogId($id) { \Yii::$app->session->set($this::SESSION_LOG_ID, $id); } public function setLogDate($date) { \Yii::$app->session->set($this::SESSION_LOG_DATE, $date); } //退出的時候必須全部刪除 public function clean() { \Yii::$app->session->remove($this::SESSION_LOG_ID); \Yii::$app->session->remove($this::SESSION_LOG_DATE); }}
php#/models/log/DayLogInterface.phpnamespace app\models\log;interface DayLogInterface{ public function check();}
php#/models/log/MemberLog.phpnamespace app\models\log;use yii\base\Event;use yii\db\ActiveRecord;use yii\web\User;class MemberLog extends DayLog implements DayLogInterface{ const SESSION_LOG_ID = 'u_day_id'; // 日誌的儲存ID const SESSION_LOG_DATE = 'u_day_date'; //日誌中儲存的日期 YYYY-MM-dd public $allowFields = []; public static function tableName() { return '{{%daylog_member}}'; } public function check() { //如果不是GUEST檢查是否有日誌 if (!\Yii::$app->user->isGuest) { $logId = $this->getLogId(); $logDate = $this->getLogDate(); $today = date('Y-m-d'); if ($logId && $logDate == $today) { //當天日誌已經建立 } else { $row = self::find() ->where(['uid' => \Yii::$app->user->getId(), 'date' => $today]) ->one(); if ($row) { //資料庫中有當天記錄 $this->setLogId($row->id); $this->setLogDate($row->date); } else { $log = new self(); $log->date = $today; $log->uid = \Yii::$app->user->getId(); if ($log->save() && $log->id) { $this->setLogId($log->id); $this->setLogDate($log->date); } } } //綁定事件 登入前清空原有記錄 Event::on(User::className(), User::EVENT_BEFORE_LOGIN, [ActiveRecord::className(), 'clean']); } }}
免責聲明,我沒寫過yii,只能從OOP的方向說一下問題
我覺得這個代碼,依賴關係搞錯了,這個邏輯上,應該是$app->user $app->session依賴record,而現在是record依賴user和session
所以如果我來封裝,應該大概是這樣
phpclass MemberLog { public function __construct($user) { // find record by user $this->record = findByUser($user); } public function check() { $this->record->doSomething(); }}