Edited at

PSR-6 Caching Interface

More than 1 year has passed since last update.

PSR一覧

PSR-5 / PSR-6 / PSR-11 / PSR-12 / PSR-14 / PSR-16

2015/08/20現在、AcceptされたPSRは0,1,2,3,4,7の5種類です。

このうちPSR-4はPSR-0の置き換えなので実質4種類となります。

まあここらへんは解説記事たくさんあるのでいいでしょう。

で、現在PSR-6 Caching Interfaceというのがレビュー中です。

PSR-6はキャッシュを扱うInterfaceです。

キャッシュは現状フレームワークによって実装が全く違うので、各フレームワークに特化した書き方をしなければならず、再利用性が全くありません。

    // Zend Framweork2

$cache = Zend\Cache\StorageFactory::adapterFactory('apc', ['ttl' => 3600]);
$cache->setItem('key', 'value');
$item = $cache->getItem('key', $success);
$cache->removeItem('key');

// CakePHP 2.x
Cache::config('short', [ 'engine' => 'Apc', 'duration' => '+1 hours' ]);
Cache::write('key', 'value');
$item = Cache::read('key');
Cache::delete('key');

// CodeIgniter
$this->load->driver('cache', ['adapter' => 'apc']);
$this->cache->save('key', 'item', 3600);
$item = $this->cache->get('key');
$this->cache->delete('key');

// Phalcon
$cache = new \Phalcon\Cache\Backend\Apc(
new \Phalcon\Cache\Frontend\Data([ 'lifetime' => 3600 ]),
[ 'prefix' => 'prefix']
);
$cache->save('key', 'value');
$item = $cache->get('key');
$cache->delete('key');

これがPSR-6対応になれば、どんなフレームワークでもだいたい同じ書き方になります。

    // PSR-6

$cache = new CacheItemPool('apc');
$cache->save( (new CacheItem('key'))->set('value', 3600) );
$item = $cache->getItem('key');
$cache->deleteItems(['key']);

PSR-6が決めているのはInterfaceだけなので、実装の中身は各FWによって違うため、CacheItemPoolやCacheItemは違う名前になる可能性があります。

しかしその中身はPsr\Cache\CacheItemInterfaceを実装しているので、同じメソッドが存在していることが保証されます。

これでキャッシュ部分の仕様については、ソースの使い回しができるようになりました。

実際問題そのまま使い回したり、もしくは何処かで言われてるように、PSRで複数のFWを混ぜて使うようになるなんてことがあるかというと、まず無いと思いますが。

そういやPsr\Cache\CacheItemInterface::__construct()が未定義だからキーの渡し方がこれで合ってる保証はないな。

なんで定義されてないんだろ?

あとまだDraftなPSRが5,8,9,10とありますが、5以外はちょっと意味がよくわかりません。