ngmy / cached-object

Laravel 4 对象的缓存方案,受企业 Rails 启发

0.1.0 2014-03-30 12:31 UTC

This package is auto-updated.

Last update: 2024-09-26 06:44:49 UTC


README

Build Status Coverage Status

Laravel 4 对象的缓存方案,受企业 Rails启发。

需求

Cached Object 需满足以下要求

  • PHP 5.3+

  • Laravel 4.0+

安装

将包添加到您的 composer.json 并运行 composer update

{
    "require": {
        "ngmy/cached-object": "dev-master"
    }
}

将以下内容添加到 app/config/app.php 中的服务提供者列表中

'Ngmy\CachedObject\CachedObjectServiceProvider',

将以下内容添加到 app/config/app.php 中的类别名列表中

'CachedObject' => 'Ngmy\CachedObject\CachedObject',

示例

基本用法

  1. 创建一个继承自 Eloquent 的物理模型
namespace App\Models\Physical;

use Illuminate\Database\Eloquent\Model as Eloquent;

class Movie extends Eloquent {}
  1. 创建一个继承自 CachedObject 的逻辑模型
namespace App\Models\Logical;

use CachedObject;

class Movie extends CachedObject {

    public static $VERSION = 1;

    public $id;

    public $name;

    public $lengthMinutes;

    public function __construct($id, $name, $lengthMinutes)
    {
        $this->id            = $id;
        $this->name          = $name;
        $this->lengthMinutes = $lengthMinutes;
    }

}

您需要定义 $VERSION。该属性用于为请求的对象创建一个唯一的缓存键。当您更改类的结构时,请增加此数字。

  1. 创建一个以 Uncached 开头的类名的未缓存版本逻辑模型
namespace App\Models\Logical;

class UncachedMovie {

    public static function get($id)
    {
        $m = \App\Models\Physical\Movie::find($id);

        if (is_null($m)) {
            return null;
        } else {
            $movie = new Movie(
                $m->id,
                $m->name,
                $m->length_minutes
            );
            return $movie;
        }
    }

}

为了获取一个逻辑模型的对象,您需要定义一个以 get 开头的方法。该方法仅在对象不在缓存中时调用。

  1. 现在,您可以通过调用 Movie::get() 来从缓存中获取对象。

物理模型观察者

  1. 创建一个观察者。

例如,当您更新物理模型时重建缓存,以及当您删除物理模型时删除缓存,定义观察者如下

namespace App\Models\Logical;

class MovieObserver
{
    public function saved($m)
    {
        Movie::rebuild($m->id);
    }

    public function deleted($m)
    {
        Movie::clear($m->id);
    }
}
  1. 将观察者注册到物理模型
\App\Models\Physical\Movie::observe(new \App\Models\Logical\MovieObserver);

更多用法

请参阅我的单元测试。