欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

第一段yii2 model类,找错与点评

程序员文章站 2022-05-02 23:10:45
...
第一段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.php
namespace 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.php
namespace app\models\log;

interface DayLogInterface
{
    public function check();
}
php#/models/log/MemberLog.php
namespace 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.php
namespace 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.php
namespace app\models\log;

interface DayLogInterface
{
    public function check();
}
php#/models/log/MemberLog.php
namespace 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();
    }
}