虽然这个项目仅仅是个毕业设计,但除了实现基本功能外,肯定也要造就一些亮点。
所以这两天就在慢慢考虑这件事情,网上看了一些什么特效做的炫些、支持多大的并发量什么的,但感觉稍微有些难度和浪费时间,然后就看到一个涉及到搜索引擎优化的。听着“搜索引擎优化”这个名字很有逼格,而且实现起来也并不难,所以就先从此下手。
什么是SEO?
SEO全称为Search Engine Optimization,汉译为搜索引擎优化,是一种利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。最大的作用是可以提高有效访问量。
思路
不同用户发表的话题各种各样,字数或多或少,非常不利于搜索引擎的检索。而我们可以根据话题内容定义一些关键字或者简短的说明作为话题的摘录,作为话题页面的description元标签使用。
因为摘录的内容是不存在的,需要根据话题自动生成,且生成时机是在数据存入数据库之前,正好可以借用Eloquent ORM中的事件和观察器来实现。
原标签
元标签可以理解为对页面数据的描述。元标签不会显示在网页,但计算机是会处理这些标签的。从SEO的角度,它会告知搜索引擎页面的核心内容。示例如下:
<meta name="description" content="@yield('description', 'XXX描述信息')" />
事件
在Eloquent模型中有几个事件可以出发,常用的有creating、created、updating、updated、saving、saved、deleting、deleted,另外还有retrieved、restoring 和 restored。通过这些事件,可以实现每当有特定的模型类在数据库保存或更新时,执行代码。
creating和created事件:当一个新模型初次保存时触发。
updated和updated事件:如果一个模型已经存在于数据库,在调用了save方法时触发。
saving和saved事件:上述两种情况都会触发。但通过Eloquent进行批量更新时,被更新模型的saved和updated事件不会触发,因为批量更新并没有真的获取模型。
模型观察器
在定义好事件之后,需要通过Eloquent观察器对模型进行事件监听。观察者类里的方法名对应Eloquent想监听的事件。必须使用具体的模型作为方法的唯一参数。
一般实现方式是在模型观察器中定义具体的事件,然后在服务提供者的boot方法中注册观察者。
现在观察器TopicObserver中定义事件,在将话题数据存入数据库之前(即Topic模型保存时触发saving事件)),生成话题的摘录或关键字。
<?php
namespace App\Observers;
use App\Models\Topic;
class TopicObserver
{
public function saving(Topic $topic)
{
$topic->excerpt = '摘录或关键字';
}
}
然后在服务提供者的boot方法注册刚刚定义的观察者。
<?php
namespace App\Providers;
use App\Models\Topic;
use App\Observers\TopicObserver;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* 注册服务提供者
*
* @return void
*/
public function register()
{
//
}
/**
* 引导应用程序服务.
*
* @return void
*/
public function boot()
{
Topic::observe(TopicObserver::class);
}
}
至此,就可以在每次将话题存入数据库之前,使用模型观察器对saving保存事件进行监听,在监听到话题保存事件时自动生成相应的摘录,而摘录内容就可以应用于网页的元标签内告知搜索引擎页面的核心内容,达到SEO搜索引擎优化的目的。