51.垃圾内容检测机制(三)
- 本系列文章为
laracasts.com
的系列视频教程——Let's Build A Forum with Laravel and TDD 的学习笔记。若喜欢该系列视频,可去该网站订阅后下载该系列视频, 支持正版 ;- 视频源码地址:github.com/laracasts/Lets-Build-a-...;
- 本项目为一个 forum(论坛)项目,与本站的第二本实战教程 《Laravel 教程 - Web 开发实战进阶》 类似,可互相参照。
本节说明
- 对应视频教程第 51 小节:Spam Detection At All Ports
本节内容
目前,我们只在用户添加回复时运行了检测机制,但是,我们还需要对更新回复或新建话题进行检测。首先我们检测更新回复:
forum\app\Http\Controllers\RepliesController.php
.
.
public function update(Reply $reply,Spam $spam)
{
$this->authorize('update',$reply);
$this->validate(request(),['body' => 'required']);
$spam->detect(request('body'));
$reply->update(request(['body']));
}
.
.
我们又一次使用了以下代码:
$this->validate(request(),['body' => 'required']);
$spam->detect(request('body'));
还记得我们的 DRY 原则吗?我们把上面的代码抽取出来:
forum\app\Http\Controllers\RepliesController.php
.
.
public function store($channelId,Thread $thread)
{
$this->validateReply();
$reply = $thread->addReply([
'body' => request('body'),
'user_id' => auth()->id(),
]);
if(request()->expectsJson()){
return $reply->load('owner');
}
return back()->with('flash','Your reply has been left.');
}
public function update(Reply $reply)
{
$this->authorize('update',$reply);
$this->validateReply();
$reply->update(request(['body']));
}
.
.
protected function validateReply()
{
$this->validate(request(),['body' => 'required']);
resolve(Spam::class)->detect(request('body'));
}
}
接着是新建话题:
forum\app\Http\Controllers\ThreadsController.php
.
.
public function store(Request $request,Spam $spam)
{
$this->validate($request,[
'title' => 'required',
'body' => 'required',
'channel_id' => 'required|exists:channels,id'
]);
$spam->detect($request['body']);
$thread = Thread::create([
'user_id' => auth()->id(),
'channel_id' => request('channel_id'),
'title' => request('title'),
'body' => request('body'),
]);
return redirect($thread->path())
->with('flash','Your thread has been published!');
}
.
.
现在如果我们进行不合法的操作,就会被阻止:
但是我们还有问题需要解决,那就是被阻止后前端的反馈。我们将在下一节解决这个问题,最后运行以下全部测试: