第一段yii2 model類,找錯與點評

來源:互聯網
上載者:User
第一段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();    }}
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.