本节我们将以文章的增删改查作为实例系统讲述缓存的使用,这个实例是对之前创建RESTFul风格控制器实现文章增删改查这篇教程的改造和升级,我们将在其基础上融合进Eloquent ORM和模型事件,将应用的场景直接拉到生成环境。
1、准备工作
路由及控制器
路由的定义和控制器的创建保持和创建RESTFul风格控制器实现文章增删改查中一样。
创建数据表
关于文章对应数据表我们在数据库部分使用查询构建器实现对数据库的高级查询已有提及,这里我们使用之前创建的数据表即可。
创建文章模型
关于文章模型Post的创建也和之前Eloquent ORM部分讲ORM概述、模型定义及基本查询中创建的一致。
2、修改控制器
在之前我们是通过缓存实现对文章的增删改查操作,这里我们将其修改为通过数据库实现增删改查操作:
namespace AppHttpControllers;
use IlluminateHttpRequest;
use Cache;
use AppModelsPost;
use AppHttpRequests;
use AppHttpControllersController;
class PostController extends Controller
{
/**
* 显示文章列表.
*
* @return Response
*/
public function index()
{
//使用all获取所有数据,如果数据量大采用分页获取
$posts = Post::all();
if(!$posts)
exit('还没有发布任何文章!');
$html = '
foreach ($posts as $post) {
$html .= '
$html .= '
return $html;
}
/**
* 创建新文章表单页面
*
* @return Response
*/
public function create()
{
$postUrl = route('post.store');
$csrf_field = csrf_field();
$html = <<
/**
* 将新创建的文章存储到存储器
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$title = $request->input('title');
$content = $request->input('content');
$post = new Post;
$post->title = $title;
$post->content = $content;
$post->save();
return redirect()->route('post.show',['post'=>$post]);
}
/**
* 显示指定文章
*
* @param int $id
* @return Response
*/
public function show($id)
{
$post = Cache::get('post_'.$id);
if(!$post){
$post = Post::find($id);
if(!$post)
exit('指定文章不存在!');
Cache::put('post_'.$id,$post,60*24*7);
}
if(!Cache::get('post_views_'.$id))
Cache::forever('post_views_'.$id,0);
$views = Cache::increment('post_views_'.$id);
Cache::forever('post_views_'.$id,$views);
$editUrl = route('post.edit',['post'=>$post]);
$deleteUrl = route('post.destroy',['post'=>$post]);
$html = <<
{$post->content}
return $html;
}
/**
* 显示编辑指定文章的表单页面
*
* @param int $id
* @return Response
*/
public function edit($id)
{
$post = Post::find($id);
if(!$post)
exit('指定文章不存在!');
$postUrl = route('post.update',['post'=>$post]);
$csrf_field = csrf_field();
$html = <<
}
/**
* 在存储器中更新指定文章
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
$post = Post::find($id);
if(!$post)
exit('指定文章不存在!');
$title = $request->input('title');
$content = $request->input('content');
$post->title = $title;
$post->content = $content;
$post->save();
return redirect()->route('post.show',['post'=>$post]);
}
/**
* 从存储器中移除指定文章
*
* @param int $id
* @return Response
*/
public function destroy($id)
{
$post = Post::find($id);
if(!$post)
exit('指定被删除文章不存在!');
if($post->delete()){
redirect()->route('post.index');
}else{
exit('删除文章失败!');
}
}
}
需要注意的是在show方法中,我们首先从缓存中取文章数据,缓存中不存在才会去数据库取,同时将数据回写到缓存中,由于对数据库的操作大部分都是读操作,所以这一点小小的改进对性能却有很大提升,尤其是在海量数据时。此外我们还将访问量持久化到缓存中以提升性能。
3、在模型事件中使用缓存
我们还可以通过模型事件在文章进行增删改的时候触发相应事件将修改保存到缓存中,这里我们简单讲模型事件注册到AppServiceProvider的boot方法中:
//保存之后更新缓存数据
Post::saved(function($post){
$cacheKey = 'post_'.$post->id;
$cacheData = Cache::get($cacheKey);
if(!$cacheData){
Cache::add($cacheKey,$post,60*24*7);
}else{
Cache::put($cacheKey,$post,60*24*7);
}
});
//删除之后清除缓存数据
Post::deleted(function($post){
$cacheKey = 'post_'.$post->id;
$cacheData = Cache::get($cacheKey);
if($cacheData){
Cache::forget($cacheKey);
}
if(Cache::get('post_views_'.$post->id))
Cache::forget('post_views_'.$post->id);
});
我们将缓存有效期设置为一周。这样在文章创建或更新时会将数据保存到缓存,而删除文章时也会从缓存中移除数据,从而保证被删除后的文章查看详情时也不能浏览。
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔