在一般添加文章过程中,我们也都会上传图片。因此,新增文章就分为两部分,首先获取前台提交数据,但无法获取上传图片信息;第二步完成上传图片功能并将图片在服务器上保存的名字,赋值到获取前台数据的数组中,最后完成数据添加即可。

Thinkphp5使用模型层的事件完成在新增数据前上传图片的功能-LMLPHP

整个过程大致分为这几步,它们是顺序的过程,这是我们解决问题的一种方法(普遍采用的方式),可用数据库和模型方法完成。

Thinkphp5使用模型层的事件完成在新增数据前上传图片的功能-LMLPHP

第二种思路:如上图所示,采用模型层的事件方法就可实现,我们将上传图片代码写到文章的模型层中,减少控制器层的代码量。当在控制层调用新增方法时,它首先会检查模型层中有没有相应的事件方法,如果有则会优先执行它,然后在执行控制器中相应代码。今天我们要讲的就是采用模型事件的方式(这种方法只限在模型层使用),在完成数据新增时,先完成图片上传功能并将图片在服务器上保存的名字进行保存,最后完成新增。

一、前台界面

Thinkphp5使用模型层的事件完成在新增数据前上传图片的功能-LMLPHP

二、后台代码:

1、定义Article Model模型,添加如下代码:

Thinkphp5使用模型层的事件完成在新增数据前上传图片的功能-LMLPHP

class Article extends Model
{
 
    protected static function init()
    {
        Article::event('before_insert', function ($data) {
          //上传文件进行判断
          $file = request()->file('pic'); // 获取表单上传文件 例如上传了001.jpg
          // 移动到框架应用根目录/public/uploads/ 目录下
          if($file){
              $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
              if($info){
                  // 成功上传后 获取上传信息
                  // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
                  $data['pic']=$info->getSaveName();
              }else{
                  // 上传失败获取错误信息
                  $data['pic']='';
              }
          }
        });
    }
}
2.Article Controller中的代码如下:
Thinkphp5使用模型层的事件完成在新增数据前上传图片的功能-LMLPHP
/***
     * 添加
     */
    public function add(){
        //判断是否post提交
        if(request()->isPost()){
            //接受数据
            $data=input('post.');
            $article =new ArticleModel();
             //验证数据
              $validate=Loader::validate('article');
              if(!$validate->scene('add')->check($data)){
                  $this->error($validate->getError());
              }
 
            //$result=db('article')->insert($data);
            $result=$article->save($data);
            if($result){
                $this->success('文章添加成功!','lst');
            }else{
                $this->error('文章添加失败!');
            }
        }
        $cate=new CateModel();
        $catenames=$cate->catetree();
        $this->assign('catenames',$catenames);
        return $this->fetch();
    }
03-08 08:52