1、文章创建create方法的实现:
/**
* 创建文章
* 文章创建保存会涉及到多张表,为保证数据的完整性采用事务
*/
public function create()
{
//开启事务
$transaction = Yii::$app->db->beginTransaction();
try{
$model = new PostsModel();
$model -> setAttributes($this->attributes);
$model -> summary = $this->_getSummary();
$model -> user_id = Yii::$app->user->identity->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;
//文章创建成功以后调用的事件
//获取事件数据传递给事件
$data=array_merge($this->getAttributes(),$model->getAttributes());
$this -> _eventAfterCreate($data);
$transaction -> commit();
return true;
}catch (Exception $e){
$transaction->rollBack();
$this->_lastError = $e -> getMessage();
return false;
}
}
2、设置文章发布状态常量
const IS_VALID = 1; //发布 const NO_VALID = 0; //未发布

3、文章摘要截取方法的实现
/**
* 截取文章摘要
* @param int $s 起始位置
* @param int $e 结束位置
* @param string $char
* @return string|null
*/
public function _getSummary($s=0,$e=90,$char='utf-8')
{
if (empty($this->content))
return null;
return (mb_substr(str_replace(' ','',strip_tags($this->content)),$s,$e,$char));
}
4、定义文章创建成功后的事件常量
const EVENT_AFTER_CREATE = "evenAfterCreate"; const EVENT_AFTER_UPDATE = "evenAfterUpdate";

5、给文章创建后的调用事件绑定事件
/**
* 文章创建成功后调用事件
*/
public function _eventAfterCreate($data)
{
//添加绑定事件
$this->on(self::EVENT_AFTER_CREATE,[$this,'_eventAddTag'],$data);
//触发事件
$this->trigger(self::EVENT_AFTER_CREATE);
}
文章创建create方法基本实现,更多的细节请看后续教程文章。
到这里可以先创建一篇文章测试下,发布文章后的跳转页面如果是这样的(id后面的参数可以不一样),说明没有问题。

如提示文章保存失败,请检查下PostsModel中的rules规则,看是否如下图中红色下划线标注的那样,如果是请把'string改成'integer',因为我们设置的is_valid的常量值是整形,不是字符型。

如果是其他问题,那就要好好检查代码了。
【提示】为了安全考虑,以及yii2 form表单提交验证机制创建发布文章需要在登录状态下才可以完成,也就是说要登录后才可以发布文章,否则会报错。文章登录验证的具体实现方法可以参考《YII2博客发布文章登录验证设置》这篇文章。
