在前面已经完成管理后台添加文章,添加文章的时候除了选择专栏、输入标题和编辑文章内容之外,还需要填写摘要,摘要将作为文章页面的 description 元标签使用,有利于 SEO 搜索引擎优化。
摘录应该由文章内容中自动生成,生成的时机是在文章数据存入数据库之前,现在使用 Eloquent 的观察器来实现此功能。
Eloquent 模型会触发许多事件(Event),以对模型的生命周期内多个时间点进行监控: creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。事件让每当有特定的模型类在数据库保存或更新时,执行代码。当一个新模型被初次保存将会触发 creating 以及 created 事件。如果一个模型已经存在于数据库且调用了 save 方法,将会触发 updating 和 updated 事件。在这两种情况下都会触发 saving 和 saved 事件。
Eloquent 观察器允许对给定模型中进行事件监控,观察者类里的方法名对应 Eloquent 想监听的事件。每种方法接收 model 作为其唯一的参数。代码生成器已经为我们生成了一个观察器文件,并在 AppServiceProvider 中注册。接下来要定制此观察器,在 Article 模型保存时触发的 saving事件中,对 摘要 excerpt 字段进行赋值。
添加观察器
运行如下命令创建观察器:
php artisan make:observer ArticleObserver
替换内容为如下内容:app/Observers/ArticleObserver
<?phpnamespace App\Observers;use App\Models\Article;class ArticleObserver{public function saving(Article $article){$article->excerpt = $this->make_excerpt($article->content);}public function make_excerpt($value, $length = 200){$excerpt = trim(preg_replace('/\r\n|\r|\n+/', ' ', strip_tags($value)));return str()->limit($excerpt, $length);}}
注册观察器
修改 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');
});
}
现在添加文章的时候不需要填入摘要字段,自动由文章内容生成摘要字段。
