第一段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(); }}