2016-01-18 14:59:30 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Cache ;
2016-08-03 07:54:03 +01:00
use Psr\Cache\CacheItemInterface ;
2016-01-25 19:16:47 +00:00
use Psr\Log\LoggerInterface ;
2016-01-18 14:59:30 +00:00
use Symfony\Component\Cache\Exception\InvalidArgumentException ;
/**
* @ author Nicolas Grekas < p @ tchwork . com >
*/
2016-08-03 07:54:03 +01:00
final class CacheItem implements CacheItemInterface
2016-01-18 14:59:30 +00:00
{
2016-06-13 15:28:45 +01:00
protected $key ;
protected $value ;
2016-12-09 17:34:32 +00:00
protected $isHit = false ;
2016-06-13 15:28:45 +01:00
protected $expiry ;
protected $defaultLifetime ;
2016-04-26 16:44:27 +01:00
protected $tags = array ();
2016-12-09 17:34:32 +00:00
protected $prevTags = array ();
2016-06-13 15:28:45 +01:00
protected $innerItem ;
protected $poolHash ;
2016-01-18 14:59:30 +00:00
/**
* { @ inheritdoc }
*/
public function getKey ()
{
return $this -> key ;
}
/**
* { @ inheritdoc }
*/
public function get ()
{
return $this -> value ;
}
/**
* { @ inheritdoc }
*/
public function isHit ()
{
return $this -> isHit ;
}
/**
* { @ inheritdoc }
*/
public function set ( $value )
{
$this -> value = $value ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function expiresAt ( $expiration )
{
if ( null === $expiration ) {
2016-02-03 09:28:28 +00:00
$this -> expiry = $this -> defaultLifetime > 0 ? time () + $this -> defaultLifetime : null ;
2016-01-18 14:59:30 +00:00
} elseif ( $expiration instanceof \DateTimeInterface ) {
2016-04-17 12:41:09 +01:00
$this -> expiry = ( int ) $expiration -> format ( 'U' );
2016-01-18 14:59:30 +00:00
} else {
throw new InvalidArgumentException ( sprintf ( 'Expiration date must implement DateTimeInterface or be null, "%s" given' , is_object ( $expiration ) ? get_class ( $expiration ) : gettype ( $expiration )));
}
return $this ;
}
/**
* { @ inheritdoc }
*/
public function expiresAfter ( $time )
{
if ( null === $time ) {
2016-02-03 09:28:28 +00:00
$this -> expiry = $this -> defaultLifetime > 0 ? time () + $this -> defaultLifetime : null ;
2016-01-18 14:59:30 +00:00
} elseif ( $time instanceof \DateInterval ) {
2016-04-17 12:41:09 +01:00
$this -> expiry = ( int ) \DateTime :: createFromFormat ( 'U' , time ()) -> add ( $time ) -> format ( 'U' );
2016-01-18 14:59:30 +00:00
} elseif ( is_int ( $time )) {
2016-02-03 09:28:28 +00:00
$this -> expiry = $time + time ();
2016-01-18 14:59:30 +00:00
} else {
throw new InvalidArgumentException ( sprintf ( 'Expiration date must be an integer, a DateInterval or null, "%s" given' , is_object ( $time ) ? get_class ( $time ) : gettype ( $time )));
}
return $this ;
}
2016-01-25 19:16:47 +00:00
2016-04-26 16:44:27 +01:00
/**
2016-08-03 07:54:03 +01:00
* Adds a tag to a cache item .
*
* @ param string | string [] $tags A tag or array of tags
*
* @ return static
*
2017-01-13 10:10:10 +00:00
* @ throws InvalidArgumentException When $tag is not valid
2016-04-26 16:44:27 +01:00
*/
public function tag ( $tags )
{
if ( ! is_array ( $tags )) {
$tags = array ( $tags );
}
foreach ( $tags as $tag ) {
if ( ! is_string ( $tag )) {
throw new InvalidArgumentException ( sprintf ( 'Cache tag must be string, "%s" given' , is_object ( $tag ) ? get_class ( $tag ) : gettype ( $tag )));
}
if ( isset ( $this -> tags [ $tag ])) {
continue ;
}
if ( ! isset ( $tag [ 0 ])) {
throw new InvalidArgumentException ( 'Cache tag length must be greater than zero' );
}
2017-01-13 10:10:10 +00:00
if ( false !== strpbrk ( $tag , '{}()/\@:' )) {
2016-04-26 16:44:27 +01:00
throw new InvalidArgumentException ( sprintf ( 'Cache tag "%s" contains reserved characters {}()/\@:' , $tag ));
}
$this -> tags [ $tag ] = $tag ;
}
return $this ;
}
2016-12-09 17:34:32 +00:00
/**
* Returns the list of tags bound to the value coming from the pool storage if any .
*
* @ return array
*
* @ experimental in version 3.3
*/
public function getPreviousTags ()
{
return $this -> prevTags ;
}
2016-04-20 10:13:42 +01:00
/**
* Validates a cache key according to PSR - 6.
*
2016-06-29 06:42:25 +01:00
* @ param string $key The key to validate
2016-04-20 10:13:42 +01:00
*
2017-08-24 07:39:03 +01:00
* @ return string
*
2017-01-13 09:44:13 +00:00
* @ throws InvalidArgumentException When $key is not valid
2016-04-20 10:13:42 +01:00
*/
public static function validateKey ( $key )
{
if ( ! is_string ( $key )) {
throw new InvalidArgumentException ( sprintf ( 'Cache key must be string, "%s" given' , is_object ( $key ) ? get_class ( $key ) : gettype ( $key )));
}
if ( ! isset ( $key [ 0 ])) {
throw new InvalidArgumentException ( 'Cache key length must be greater than zero' );
}
2017-01-13 09:44:13 +00:00
if ( false !== strpbrk ( $key , '{}()/\@:' )) {
2016-04-27 07:45:20 +01:00
throw new InvalidArgumentException ( sprintf ( 'Cache key "%s" contains reserved characters {}()/\@:' , $key ));
2016-04-20 10:13:42 +01:00
}
2017-08-24 07:39:03 +01:00
return $key ;
2016-04-20 10:13:42 +01:00
}
2016-01-25 19:16:47 +00:00
/**
* Internal logging helper .
*
* @ internal
*/
2016-02-02 15:39:10 +00:00
public static function log ( LoggerInterface $logger = null , $message , $context = array ())
2016-01-25 19:16:47 +00:00
{
if ( $logger ) {
$logger -> warning ( $message , $context );
} else {
$replace = array ();
foreach ( $context as $k => $v ) {
if ( is_scalar ( $v )) {
$replace [ '{' . $k . '}' ] = $v ;
}
}
@ trigger_error ( strtr ( $message , $replace ), E_USER_WARNING );
}
}
2016-01-18 14:59:30 +00:00
}