分享一个Laravel好用的Cache宏

Laravel提供的缓存工具很好用,手册里介绍了一些基本的用法,比如get,put,forget,forever等,一开始我是像下面这样使用的:

代码如下:

if (!$article = Cache::get('article_1')) {
    $article = Article::find(1);
    Cache::forever('article_1',$article);
}

这是最基本的用法,自动判断缓存是否存在,不存在则从数据库中取并写入缓存。

后来发现模型也自带remember 和 rememberForever方法,例如可以这样:

代码如下:

$article = Article::rememberForever('article_1')->where('id','=',1);

这个有局限性,在复杂查询时并不能完全缓存数据,比如使用了with()预加载关联数据时就无法缓存关联数据。

然后发现Cache也可以像Response那样自定义宏方法,遂作如下尝试:

代码如下:

//注册缓存存取宏
Cache::macro('want',function($key,$minutes=0,$callback){
    if (!$data = Cache::get($key)) {
        $data = call_user_func($callback);
        if ($minutes == 0) {
            Cache::forever($key,$data);
        } else {
            Cache::put($key,$data,$minutes);
        }
    }
    return $data;
});

这个方法可以放在bootstrap/start.php里,也可以放在filter中的App::before()中,随自己项目方便吧,看下如何使用的:

代码如下:

$id = Input::get('id');
$article = Cache::want('article_'.$id,0,function() use ($id){
    return Article::with('tags')->findOrFail($id,['id','cid','title','content_html as content','created_at','updated_at']);
});

个人挺喜欢这种写法的。希望大家能够喜欢本文内容。

(0)

相关推荐

  • laravel 5 实现模板主题功能

    众所周知,laravel渲染模板是通过View::make()实现的,需要显式指定模板文件路径: 复制代码 代码如下: function index() {     return View::make('index.index'); } 既然这样,我们就可以自己实现模板主题功能,我们只需要将模板文件放到一个主题名称对应的目录里就行,比如默认主题为 default 的话,我们就这样写: 复制代码 代码如下: function index() {     return View::make('def

  • Laravel5中contracts详解

    我们先来看看官方文档中对contracts的定义: Laravel's Contracts are a set of interfaces that define the core services provided by the framework. 意思是说Laravel的Contracts是一个由 框架提供 的定义了 核心服务接口 的集合. 也就是说,每一个Contract都是一个接口,对应一个框架核心服务. 那它的意义何在?官网给出的解释也很简单:使用接口是为了 松耦合 和 简单 . 先

  • 初识laravel5

    目录结构变化 laravel5最先强调的是项目目录结构的变化,与4.2区别还是蛮大的,逐条来说吧. 新的目录结构看上去像这样: app     Commands     Console     Events     Handlers         Commands         Events     Http         Controllers         Middleware         Requests         Kernel.php         routes.ph

  • laravel安装zend opcache加速器教程

    以文章页为例,通过chrome抓包,waiting的时间达到147ms,实际上未作缓存优化前,这个页面大概有4条sql语句,速度也只是152ms左右,差别不大,所以我决定安装zend opcache加速php. 当我在服务器上安装了zend opcache后,再测试,waiting已经下降到68ms,效果明显. so,laravel项目还是有必要安装此类php加速器的. 附安装教程: zend opcache(ZendOptimizerPlus) 项目目前托管在github,项目地址为: htt

  • laravel容器延迟加载以及auth扩展详解

    昨天按照手册教程,动手写一个Auth扩展,按照包独立性的原则,我不希望将Auth::extend()这种方法写在 start.php 中,毫无疑问,我选择了在服务提供器register()方法中注册扩展驱动.然而,事与愿违-- 发现问题 当我在 LoauthServiceProvider 中这样写的时候: 复制代码 代码如下: public function register() {     //     \Auth::extend('loauth',function($app){}); } 报

  • Laravel框架路由配置总结、设置技巧大全

    基本路由 您的应用程序的绝大多数路由将在 app/routes.php 文件中定义.Laravel 中最简单的路由由一个 URI 和一个闭包调用组成. 基本 GET 路由 复制代码 代码如下: Route::get('/', function() { return 'Hello World'; }); 基本 POST 路由 复制代码 代码如下: Route::post('foo/bar', function() { return 'Hello World'; }); 注册一个路由以响应所有 HT

  • Laravel框架表单验证详解

    基础验证例子 复制代码 代码如下: $validator = Validator::make( array('name' => 'Dayle'), array('name' => 'required|min:5') ); 传递给 make 函数的第一个参数是待验证的数据,第二个参数是对该数据需要应用的验证规则. 多个验证规则可以通过 "|" 字符进行隔开,或者作为数组的一个单独的元素. 通过数组指定验证规则 复制代码 代码如下: $validator = Validator

  • PHP开发框架Laravel数据库操作方法总结

    一.读/写连接 有时您可能希望使用一个SELECT语句的数据库连接,,另一个用于插入.更新和删除语句.Laravel使这微风,将始终使用正确的连接是否使用原始查询,查询生成器或雄辩的ORM. 如何读/写连接应该配置,让我们看看这个例子: 复制代码 代码如下: 'mysql' => array('read' => array('host' => '192.168.1.1'),'write' => array('host' => '196.168.1.2'),'driver' =

  • laravel 5 实现模板主题功能(续)

    在之前一篇文章中我介绍了通过定义Response宏的方式来实现动态改变模板文件路径以实现主题功能: laravel实现模板主题功能,但后来我发现这种方法有个弊端,在模板中使用@extends必须显式指定模板路径,这可能造成混乱,我决定还是改变思想,主题和主题之间应该是完全隔离的,不存在就是不存在,不要自动去另外的主题中寻找替代的模板. 而原来定义response宏的方式可以实现,但我决定使用更加规范的方法. laravel的View类里有一个方法 View::addNamespace ,这个方法

  • 分享一个Laravel好用的Cache宏

    Laravel提供的缓存工具很好用,手册里介绍了一些基本的用法,比如get,put,forget,forever等,一开始我是像下面这样使用的: 复制代码 代码如下: if (!$article = Cache::get('article_1')) {     $article = Article::find(1);     Cache::forever('article_1',$article); } 这是最基本的用法,自动判断缓存是否存在,不存在则从数据库中取并写入缓存. 后来发现模型也自带

  • 分享一个入门级可控多线程shell脚本代码

    说到shell可控多线程,网上分享的大部分是管道控制的方案.这种方案,张戈博客也曾经实战并分享过一次:<Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点>,感兴趣的朋友可以看看. 分享一个入门级可控多线程shell脚本方案 下面张戈博客再分享另一种更容易理解的入门级可控多线程shell脚本方案:任务切割.各个击破. 先来 1 段场景描述: 某日,在鹅厂接到了这个任务,需要在Linux服务器中,对几千个IP进行一次Ping检测,只要取得ping可达的IP就好.如果单个IP去pi

  • 分享一个我自己写的ToolTip提示插件(附源码)

    继续分享一个我自己写的 ToolTip提示插件,希望大家支持我,给我点评论,哪怕骂我的也好啊,让我知道有人在关注我"小豆" 嘿嘿.废话不多说上代码! 复制代码 代码如下: $.fn.ToolTip = function (option) { var defaults = { direction: "down", star: function () { }, from: $(this), url: '../images/arrow.png' }; //方法内基础变量

  • 分享一个插件实现水珠自动下落效果

    分享一个水珠自动下落的插件,下载地址:https://github.com/foreverjiangting/rainyday.js 下面来看看如何使用它?添加下面代码即可运行它. 实现效果如下: 代码如下: <!DOCTYPE HTML> <html> <head> <style> </style> <meta http-equiv="Content-Type" content="text/html; cha

  • 分享一个简单的java爬虫框架

    反复给网站编写不同的爬虫逻辑太麻烦了,自己实现了一个小框架 可以自定义的部分有: 请求方式(默认为Getuser-agent为谷歌浏览器的设置),可以通过实现RequestSet接口来自定义请求方式 储存方式(默认储存在f盘的html文件夹下),可以通过SaveUtil接口来自定义保存方式 需要保存的资源(默认为整个html页面) 筛选方式(默认所有url都符合要求),通过实现ResourseChooser接口来自定义需要保存的url和资源页面 实现的部分有: html页面的下载方式,通过Htt

  • 分享一个简单的python读写文件脚本

    先来看一段创建文件并写入文本的代码,然后作介绍. #!/usr/bin/env python 'makeFile.py -- create a file' import os ls = os.linesep # get filename while True: fname = raw_input('Input an unused file name >') if os.path.exists(fname): print "ERROR: '%s' already exists" %

  • 分享一个python的aes加密代码

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.---百度百科 本科的时候弄过DES

  • 分享一个可以通过命令简写执行对应命令的Shell脚本

    本篇文章介绍一个可以通过命令简写执行对应命令的 shell 脚本. 假设这个 shell 脚本的名称为 tinyshell.sh. 在 Linux 下进行项目开发,经常会用到一些调试开发命令. 这些命令可能比较长,需要输入多个字符. 例如,Android 系统抓取全部 log 并包含 log 时间的命令是 adb logcat -b all -v threadtime. 抓取 log 是调试开发非常常见的操作,这个命令又很长,输入起来不方便. 为了简化输入,可以配置一些命令简写来对应比较长命令.

  •  分享一个Python 遇到数据库超好用的模块

    目录 一.定义表结构 二.创建以及删除表 三.插入数据 四.查询 五.更新和删除数据 六.直接运行SQL语句 七.DataFrame到MySQL数据库 前言: 大家好,今天我和大家来聊一下SQLALchemy这个模块,该模块是Python当中最有名的ORM框架,该框架是建立在数据库API之上,使用关系对象映射进行数据库的操作,简而言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果. 看到这里,相信不少的读者可能会感觉到云里雾里,我们就通过一个简单的案例在说明一下吧. 例如我

  • 分享一个关于Storyboard 跳转与传值

    写在前面的知识: 因为苹果推 Storyboard 而且 目前来看, Apple Watch 也是用 Storyboard 就知道, 明天应用估计都是 Storyboard 的天下了.  (水平有限, 不对之处在所难免, 望海涵) 很多人似乎还是在用 XIB, 对 Storyboard 如何进行跳转 似乎 懵懵懂懂... 好吧, 鉴于 早上群里, 有人问 怎么跳转, 怎么传值 等等问题. 就做下总结, 同时为大家 提供一些方法和参考.  *** 1. 最简单的方法 拖拽, 这个就不用多解释了吧.

随机推荐