3-11 Yii2框架博客系统文章创建create方法实现 观察者模式,高内聚,低松耦合

概览

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.文章内容截取方法

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值