我現在在嘗試寫一個
PSR-6的實現
當我在實現CacheItemPoolInterface介面時,對於save方法感到困惑,save方法只接收一個CacheItemInterface類型的參數,但是CacheItemInterface這個介面卻沒有提供類似getExpireTime的方法,這就導致CacheItemPoolInterface沒有辦法擷取到快取項目的到期時間,也就沒辦法正確地將資料寫入到緩衝儲存裡。
我看過幾個比較著名的PSR-6實現,例如 symfony/cache php-cache/cache tedious/Stash 然而這些實現版本在實現save方法時並不是非常優雅。
比如symfony/cache
public function save(CacheItemInterface $item){ if (!$item instanceof CacheItem) { return false; } if ($this->deferred) { $this->commit(); } $this->deferred[$item->getKey()] = $item; return $this->commit();}
這個save方法只有傳入Symfony\Component\Cache\CacheItem類型的參數才可以,傳入其他類型都會返回false。
目前的情況是,如果想要寫一個用到緩衝的類庫,就必須指定一個具體的PSR-6實現作為依賴,而不僅僅是psr/cache。而反觀PSR-3這個日誌介面,要寫一個需要日誌功能的類庫,只需要引入psr/log即可,不需要具體實現。
在我看來,PSR-6並不需要CacheItemInterface這個介面,只需要把save方法修改成save($key, $value, $expire_at)即可。
我在packagist上面搜尋cache,其他一些比較出名的緩衝庫,例如doctrine/cache sonata-project/cache illuminate/cache等,都沒有選擇遵循PSR-6,應該也是這方面的考慮吧
回複內容:
我現在在嘗試寫一個PSR-6的實現
當我在實現CacheItemPoolInterface介面時,對於save方法感到困惑,save方法只接收一個CacheItemInterface類型的參數,但是CacheItemInterface這個介面卻沒有提供類似getExpireTime的方法,這就導致CacheItemPoolInterface沒有辦法擷取到快取項目的到期時間,也就沒辦法正確地將資料寫入到緩衝儲存裡。
我看過幾個比較著名的PSR-6實現,例如 symfony/cache php-cache/cache tedious/Stash 然而這些實現版本在實現save方法時並不是非常優雅。
比如symfony/cache
public function save(CacheItemInterface $item){ if (!$item instanceof CacheItem) { return false; } if ($this->deferred) { $this->commit(); } $this->deferred[$item->getKey()] = $item; return $this->commit();}
這個save方法只有傳入Symfony\Component\Cache\CacheItem類型的參數才可以,傳入其他類型都會返回false。
目前的情況是,如果想要寫一個用到緩衝的類庫,就必須指定一個具體的PSR-6實現作為依賴,而不僅僅是psr/cache。而反觀PSR-3這個日誌介面,要寫一個需要日誌功能的類庫,只需要引入psr/log即可,不需要具體實現。
在我看來,PSR-6並不需要CacheItemInterface這個介面,只需要把save方法修改成save($key, $value, $expire_at)即可。
我在packagist上面搜尋cache,其他一些比較出名的緩衝庫,例如doctrine/cache sonata-project/cache illuminate/cache等,都沒有選擇遵循PSR-6,應該也是這方面的考慮吧