Observium_CE/libs/phpFastCache/Core/Item/ItemExtendedTrait.php

405 lines
9.8 KiB
PHP

<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Core\Item;
use phpFastCache\Core\Pool\ExtendedCacheItemPoolInterface;
use phpFastCache\EventManager;
use phpFastCache\Exceptions\phpFastCacheInvalidArgumentException;
use phpFastCache\Exceptions\phpFastCacheLogicException;
/**
* Class ItemExtendedTrait
* @package phpFastCache\Core\Item
* @property \DateTimeInterface $expirationDate Expiration date of the item
* @property \DateTimeInterface $creationDate Creation date of the item
* @property \DateTimeInterface $modificationDate Modification date of the item
* @property mixed $data Data of the item
* @property bool $fetched Fetch flag status
* @property array $tags The tags array
* @property array $removedTags The removed tags array
*/
trait ItemExtendedTrait
{
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @var EventManager
*/
protected $eventManager;
/**
* @var ExtendedCacheItemPoolInterface
*/
protected $driver;
/**
* @var string
*/
protected $encodedKey;
/**
* @return string
*/
public function getEncodedKey()
{
if (!$this->encodedKey) {
$keyHashFunction = $this->driver->getConfigOption('defaultKeyHashFunction');
if ($keyHashFunction) {
$this->encodedKey = $keyHashFunction($this->getKey());
} else {
$this->encodedKey = md5($this->getKey());
}
}
return $this->encodedKey;
}
/**
* @return mixed
*/
public function getUncommittedData()
{
return $this->data;
}
/**
* @return \DateTimeInterface
*/
public function getExpirationDate()
{
return $this->expirationDate;
}
/**
* Alias of expireAt() with forced $expiration param
*
* @param \DateTimeInterface $expiration
* The point in time after which the item MUST be considered expired.
* If null is passed explicitly, a default value MAY be used. If none is set,
* the value should be stored permanently or for as long as the
* implementation allows.
*
* @return static
* The called object.
*/
public function setExpirationDate(\DateTimeInterface $expiration)
{
return $this->expiresAt($expiration);
}
/**
* @return \DateTimeInterface
* @throws phpFastCacheLogicException
*/
public function getCreationDate()
{
if ($this->driver->getConfig()[ 'itemDetailedDate' ]) {
return $this->creationDate;
} else {
throw new phpFastCacheLogicException('Cannot access to the creation date when the "itemDetailedDate" configuration is disabled.');
}
}
/**
* @param \DateTimeInterface $date
* @return $this
* @throws phpFastCacheLogicException
*/
public function setCreationDate(\DateTimeInterface $date)
{
if ($this->driver->getConfig()[ 'itemDetailedDate' ]) {
$this->creationDate = $date;
return $this;
} else {
throw new phpFastCacheLogicException('Cannot access to the creation date when the "itemDetailedDate" configuration is disabled.');
}
}
/**
* @return \DateTimeInterface
* @throws phpFastCacheLogicException
*/
public function getModificationDate()
{
if ($this->driver->getConfig()[ 'itemDetailedDate' ]) {
return $this->modificationDate;
} else {
throw new phpFastCacheLogicException('Cannot access to the modification date when the "itemDetailedDate" configuration is disabled.');
}
}
/**
* @param \DateTimeInterface $date
* @return $this
* @throws phpFastCacheLogicException
*/
public function setModificationDate(\DateTimeInterface $date)
{
if ($this->driver->getConfig()[ 'itemDetailedDate' ]) {
$this->modificationDate = $date;
return $this;
} else {
throw new phpFastCacheLogicException('Cannot access to the modification date when the "itemDetailedDate" configuration is disabled.');
}
}
/**
* @return int
*/
public function getTtl()
{
return max(0, $this->expirationDate->getTimestamp() - time());
}
/**
* @return bool
*/
public function isExpired()
{
return $this->expirationDate->getTimestamp() < (new \DateTime())->getTimestamp();
}
/**
* @param int $step
* @return $this
* @throws phpFastCacheInvalidArgumentException
*/
public function increment($step = 1)
{
if (is_int($step)) {
$this->fetched = true;
$this->data += $step;
} else {
throw new phpFastCacheInvalidArgumentException('$step must be numeric.');
}
return $this;
}
/**
* @param int $step
* @return $this
* @throws phpFastCacheInvalidArgumentException
*/
public function decrement($step = 1)
{
if (is_int($step)) {
$this->fetched = true;
$this->data -= $step;
} else {
throw new phpFastCacheInvalidArgumentException('$step must be numeric.');
}
return $this;
}
/**
* @param array|string $data
* @return $this
* @throws phpFastCacheInvalidArgumentException
*/
public function append($data)
{
if (is_array($this->data)) {
$this->data[] = $data;
} else if (is_string($data)) {
$this->data .= (string)$data;
} else {
throw new phpFastCacheInvalidArgumentException('$data must be either array nor string.');
}
return $this;
}
/**
* @param array|string $data
* @return $this
* @throws phpFastCacheInvalidArgumentException
*/
public function prepend($data)
{
if (is_array($this->data)) {
array_unshift($this->data, $data);
} else if (is_string($data)) {
$this->data = (string)$data . $this->data;
} else {
throw new phpFastCacheInvalidArgumentException('$data must be either array nor string.');
}
return $this;
}
/**
* @param $tagName
* @return $this
* @throws phpFastCacheInvalidArgumentException
*/
public function addTag($tagName)
{
if (is_string($tagName)) {
$this->tags = array_unique(array_merge($this->tags, [$tagName]));
return $this;
} else {
throw new phpFastCacheInvalidArgumentException('$tagName must be a string');
}
}
/**
* @param array $tagNames
* @return $this
*/
public function addTags(array $tagNames)
{
foreach ($tagNames as $tagName) {
$this->addTag($tagName);
}
return $this;
}
/**
* @param array $tags
* @return $this
* @throws phpFastCacheInvalidArgumentException
*/
public function setTags(array $tags)
{
if (count($tags)) {
if (array_filter($tags, 'is_string')) {
$this->tags = $tags;
} else {
throw new phpFastCacheInvalidArgumentException('$tagName must be an array of string');
}
}
return $this;
}
/**
* @return array
*/
public function getTags()
{
return $this->tags;
}
/**
* @param string $separator
* @return string
*/
public function getTagsAsString($separator = ', ')
{
return implode($separator, $this->tags);
}
/**
* @param $tagName
* @return $this
*/
public function removeTag($tagName)
{
if (($key = array_search($tagName, $this->tags)) !== false) {
unset($this->tags[ $key ]);
$this->removedTags[] = $tagName;
}
return $this;
}
/**
* @param array $tagNames
* @return $this
*/
public function removeTags(array $tagNames)
{
foreach ($tagNames as $tagName) {
$this->removeTag($tagName);
}
return $this;
}
/**
* @return array
*/
public function getRemovedTags()
{
return array_diff($this->removedTags, $this->tags);
}
/**
* Return the data as a well-formatted string.
* Any scalar value will be casted to an array
* @param int $option json_encode() options
* @param int $depth json_encode() depth
* @return string
*/
public function getDataAsJsonString($option = 0, $depth = 512)
{
$data = $this->get();
if (is_object($data) || is_array($data)) {
$data = json_encode($data, $option, $depth);
} else {
$data = json_encode([$data], $option, $depth);
}
return json_encode($data, $option, $depth);
}
/**
* Implements \JsonSerializable interface
* @return mixed
*/
public function jsonSerialize()
{
return $this->get();
}
/**
* Set the EventManager instance
*
* @param EventManager $em
* @return $this
*/
public function setEventManager(EventManager $em)
{
$this->eventManager = $em;
return $this;
}
/**
* Prevent recursions for Debug (php 5.6+)
* @return array
*/
final public function __debugInfo()
{
$info = get_object_vars($this);
$info[ 'driver' ] = 'object(' . get_class($info[ 'driver' ]) . ')';
return (array)$info;
}
}