在前面已经完成管理后台添加文章,添加文章的时候除了选择专栏、输入标题和编辑文章内容之外,还需要填写摘要,摘要将作为文章页面的 description 元标签使用,有利于 SEO 搜索引擎优化。

摘录应该由文章内容中自动生成,生成的时机是在文章数据存入数据库之前,现在使用 Eloquent 的观察器来实现此功能。

Eloquent 模型会触发许多事件(Event),以对模型的生命周期内多个时间点进行监控: creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。事件让每当有特定的模型类在数据库保存或更新时,执行代码。当一个新模型被初次保存将会触发 creating 以及 created 事件。如果一个模型已经存在于数据库且调用了 save 方法,将会触发 updatingupdated 事件。在这两种情况下都会触发 savingsaved 事件。

Eloquent 观察器允许对给定模型中进行事件监控,观察者类里的方法名对应 Eloquent 想监听的事件。每种方法接收 model 作为其唯一的参数。代码生成器已经为我们生成了一个观察器文件,并在 AppServiceProvider 中注册。接下来要定制此观察器,在 Article 模型保存时触发的 saving事件中,对 摘要 excerpt 字段进行赋值。

添加观察器

运行如下命令创建观察器:

  1. php artisan make:observer ArticleObserver

替换内容为如下内容:
app/Observers/ArticleObserver

  1. <?php
  2. namespace App\Observers;
  3. use App\Models\Article;
  4. class ArticleObserver
  5. {
  6. public function saving(Article $article)
  7. {
  8. $article->excerpt = $this->make_excerpt($article->content);
  9. }
  10. public function make_excerpt($value, $length = 200)
  11. {
  12. $excerpt = trim(preg_replace('/\r\n|\r|\n+/', ' ', strip_tags($value)));
  13. return str()->limit($excerpt, $length);
  14. }
  15. }

注册观察器

修改 AppServiceProvider.php文件中的 boot访问为如下内容:
app/Providers/AppServiceProvider.php

public function boot()
{
    Paginator::defaultView('vendor.pagination.bulma');
    Article::observe(ArticleObserver::class);
}

修改控制器

现在去掉管理后台添加和编辑文章时的摘要字段的输入,修改管理后台文章控制器中的 form方法为如下内容:

protected function form()
{
    $columns = Column::pluck('name', 'id')->toArray();

    return Form::make(new Article(), function (Form $form) use ($columns) {
        $form->display('id');
        $form->select('column_id')->options($columns);
        $form->text('title');
        $form->markdown('content');
        $form->display('created_at');
        $form->display('updated_at');
    });
}

现在添加文章的时候不需要填入摘要字段,自动由文章内容生成摘要字段。