| Current File : /home/jvzmxxx/wiki1/extensions/Flow/includes/Data/ManagerGroup.php |
<?php
namespace Flow\Data;
use Flow\Container;
use Flow\Exception\DataModelException;
/**
* A little glue code to allow passing around and manipulating multiple
* ObjectManagers more conveniently.
*/
class ManagerGroup {
/**
* @var Container
*/
protected $container;
/**
* @var string[] Map from FQCN or short name to key in container that holds
* the relevant ObjectManager
*/
protected $classMap;
/**
* @var string[] List of container keys that have been used
*/
protected $used = array();
/**
* @param Container $container
* @param string[] $classMap Map from ObjectManager alias to container key
* holding that object manager.
*/
public function __construct( Container $container, array $classMap ) {
$this->container = $container;
$this->classMap = $classMap;
}
/**
* Runs ObjectManager::clear on all managers that have been accessed since
* the last clear.
*/
public function clear() {
foreach ( array_keys( $this->used ) as $key ) {
$this->container[$key]->clear();
}
$this->used = array();
}
/**
* Purge all cached data related to this object
*
* @param object $object
*/
public function cachePurge( $object ) {
$this->getStorage( get_class( $object ) )->cachePurge( $object );
}
/**
* @param string $className
* @return ObjectManager
* @throws DataModelException
*/
public function getStorage( $className ) {
if ( !isset( $this->classMap[$className] ) ) {
throw new DataModelException( "Request for '$className' is not in classmap: " . implode( ', ', array_keys( $this->classMap ) ), 'process-data' );
}
$key = $this->classMap[$className];
$this->used[$key] = true;
return $this->container[$key];
}
/**
* @param object $object
* @param array $metadata
* @throws DataModelException
*/
public function put( $object, array $metadata ) {
$this->getStorage( get_class( $object ) )->put( $object, $metadata );
}
/**
* @param string $method
* @param array $objects
* @param array $metadata
* @throws DataModelException
*/
protected function multiMethod( $method, $objects, array $metadata ) {
$itemsByClass = array();
foreach( $objects as $object ) {
$itemsByClass[ get_class( $object ) ][] = $object;
}
foreach( $itemsByClass as $class => $myObjects ) {
$this->getStorage( $class )->$method( $myObjects, $metadata );
}
}
/**
* @param array $objects
* @param array $metadata
*/
public function multiPut( array $objects, array $metadata = array() ) {
$this->multiMethod( 'multiPut', $objects, $metadata );
}
/**
* @param array $objects
* @param array $metadata
*/
public function multiRemove( array $objects, array $metadata = array() ) {
$this->multiMethod( 'multiRemove', $objects, $metadata );
}
/**
* @param string $method
* @param array $args
* @return mixed
* @throws DataModelException
*/
protected function call( $method, $args ) {
$className = array_shift( $args );
return call_user_func_array(
array( $this->getStorage( $className ), $method ),
$args
);
}
public function get( /* ... */ ) {
return $this->call( __FUNCTION__, func_get_args() );
}
public function getMulti( /* ... */ ) {
return $this->call( __FUNCTION__, func_get_args() );
}
public function find( /* ... */ ) {
return $this->call( __FUNCTION__, func_get_args() );
}
public function findMulti( /* ... */ ) {
return $this->call( __FUNCTION__, func_get_args() );
}
public function found( /* ... */ ) {
return $this->call( __FUNCTION__, func_get_args() );
}
public function foundMulti( /* ... */ ) {
return $this->call( __FUNCTION__, func_get_args() );
}
}