public static function read($name, $key, array $options = array())
{
$options += array('conditions' => null, 'strategies' => true, 'write' => null);
if (is_callable($options['conditions']) && !$options['conditions']()) {
return false;
}
try {
$adapter = static::adapter($name);
} catch (ConfigException $e) {
return false;
}
$key = static::key($key);
if ($isMulti = is_array($key)) {
$keys = $key;
} else {
$keys = array($key);
}
$params = compact('keys');
$results = static::_filter(__FUNCTION__, $params, function ($self, $params) use($adapter) {
return $adapter->read($params['keys']);
});
if ($write = $options['write']) {
$write = is_callable($write) ? $write() : $write;
list($expiry, $value) = each($write);
$value = is_callable($value) ? $value() : $value;
foreach ($keys as $key) {
if (isset($results[$key])) {
continue;
}
if (!static::write($name, $key, $value, $expiry)) {
return false;
}
$results[$key] = static::applyStrategies('write', $name, $value, array('key' => $key, 'mode' => 'LIFO', 'class' => __CLASS__));
}
}
if ($options['strategies']) {
foreach ($results as $key => &$result) {
$result = static::applyStrategies(__FUNCTION__, $name, $result, array('key' => $key, 'mode' => 'LIFO', 'class' => __CLASS__));
}
}
return $isMulti ? $results : ($results ? reset($results) : null);
}