在前面已经完成管理后台添加文章,添加文章的时候除了选择专栏、输入标题和编辑文章内容之外,还需要填写摘要,摘要将作为文章页面的 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
<?php
namespace 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');
});
}
现在添加文章的时候不需要填入摘要字段,自动由文章内容生成摘要字段。