3-11 Yii2框架部落格系統文章建立create方法實現 觀察者模式,高內聚,低鬆耦合

NO IMAGE

概覽

1.create方法實現

    

原始碼思路   控制器為了實現新增呼叫-》表單模型處理邏輯方法-》表單模型補全欄位資料呼叫資料庫模型

1. 要完成資料的建立新增,所以要引用適合的場景

    場景的定義 /frontend/models/postform

    /**
* 用常量定義場景
* SCENARIOS_CREATE 建立 音標  [sɪ’nɑ:ri:əʊz]
* SCENARIOS_UPDATE 更新
* 場景的應用就是限制了所應用的欄位 可以自行調整
*/

const SCENARIOS_CREATE = ‘create’;
const SCENARIOS_UPDATE = ‘update’;

/**
* 場景設定
*/
public function scenarios(){
$scenarios = [
self::SCENARIOS_CREATE=>[‘title’,’content’,’label_img’,’cat_id’,’tags’],
self::SCENARIOS_UPDATE=>[‘title’,’content’,’label_img’,’cat_id’,’tags’],
];
return array_merge(parent::scenarios(),$scenarios);
#繼承了default的場景 將繼承的場景覆蓋合併到現在的場景中去。

}

1.定義完了適合的場景 控制器開始呼叫   frontend/controller/postcontroller

    /**
* 建立文章
*/
public function actionCreate(){
$model = new PostForm();
// 定義場景
$model->setScenario(PostForm::SCENARIOS_CREATE);

if($model->load(Yii::$app->request->post()) && $model->validate()){
            if(!$model->create()){
                Yii::$app->session->setFlash(‘warning’, $model -> _lastError);
            }else{
            return $this->redirect([‘post/view’, ‘id’ => $model->id]);
            }
        }

// 獲取所有分類
$cat = CatsModel::getAllCats();
return $this->render(‘create’,[‘model’=>$model,’cat’=>$cat]);
}

3.表單模型開始處理資料邏輯        /frontend/models/postform

/**
* 文章建立
* 主旨思想 :運用資料庫的事物、 資料處理放到PostsModel、業務邏輯放到PostsForm中
* transaction 英文翻譯 ’交易‘
*
*
* 事件 運用的是’觀察者‘的模式
*/
public function create()
{
$transaction = Yii::$app->db->beginTransaction();
try {
$model = new PostsModel(); # 引入 common\models\PostsModel
$model->setAttributes($this->attributes);#當前有的資料放到新的裡面去,可能欄位不夠 所以下面要加資料欄位值
$model->summary = $this->_getSummary(); # 內容
$model->user_id = Yii::$app->user->identity->id; # 獲取當前登入的使用者id
$model->user_name = Yii::$app->user->identity->username;# 獲取當前登入的使用者名稱稱
$model->is_valid = PostsModel::IS_VALID; # 是否釋出   備註 欄位屬性之類的東西最好就用常量去實現
$model->created_at = time(); # 建立時間
$model->updated_at = time(); # 更新時間
if (!$model->save()) {
throw new Exception(“文章儲存失敗!”); # 可以用語言包
}

$this->id = $model->id; # 如果成功 將資料所插入的id返回給控制層 渲染檢視當前的頁面

// 呼叫事件
$this->_eventAfterCreate(); # 運用事件是因為 文章建立完後還有有其他的事件所要去完成   比如文章建立完成之後要新增一些積分 所以要後續在此事件中去完成
$transaction->commit();
return true;

} catch (Exception $e) {
$transaction->rollBack();
$this->_lastError = $e->getMessage();
return false;
}
}

/**
* 擷取文章摘要
*
*/
private function _getSummary($s = 0,$e = 90,$char = ‘utf-8’){
if (empty($this->content)) {
return null;
}else{
return (mb_substr(str_replace(‘ ’,”,strip_tags($this->content)),$s,$e,$char));
}
}

/**
* 建立完成之後呼叫事件方法
*
*/

public function _eventAfterCreate()
{

}

 

2.文章內容擷取方法