-
Notifications
You must be signed in to change notification settings - Fork 11.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
38f9113
commit 40913ac
Showing
1 changed file
with
186 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
<?php | ||
|
||
namespace Illuminate\Cache; | ||
|
||
use Closure; | ||
use InvalidArgumentException; | ||
|
||
abstract class MultipleInstanceManager | ||
{ | ||
/** | ||
* The application instance. | ||
* | ||
* @var \Illuminate\Contracts\Foundation\Application | ||
*/ | ||
protected $app; | ||
|
||
/** | ||
* The array of resolved instances. | ||
* | ||
* @var array | ||
*/ | ||
protected $instances = []; | ||
|
||
/** | ||
* The registered custom instance creators. | ||
* | ||
* @var array | ||
*/ | ||
protected $customCreators = []; | ||
|
||
/** | ||
* Create a new manager instance. | ||
* | ||
* @param \Illuminate\Contracts\Foundation\Application $app | ||
* @return void | ||
*/ | ||
public function __construct($app) | ||
{ | ||
$this->app = $app; | ||
} | ||
|
||
/** | ||
* Get the default instance name. | ||
* | ||
* @return string | ||
*/ | ||
abstract public function getDefaultInstance(); | ||
|
||
/** | ||
* Set the default instance name. | ||
* | ||
* @param string $name | ||
* @return void | ||
*/ | ||
abstract public function setDefaultInstance($name); | ||
|
||
/** | ||
* Get the instance specific configuration. | ||
* | ||
* @param string $name | ||
* @return array | ||
*/ | ||
abstract public function getInstanceConfig($name); | ||
|
||
/** | ||
* Get an instance instance by name. | ||
* | ||
* @param string|null $name | ||
* @return mixed | ||
*/ | ||
public function instance($name = null) | ||
{ | ||
$name = $name ?: $this->getDefaultInstance(); | ||
|
||
return $this->instances[$name] = $this->get($name); | ||
} | ||
|
||
/** | ||
* Attempt to get an instance from the local cache. | ||
* | ||
* @param string $name | ||
* @return mixed | ||
*/ | ||
protected function get($name) | ||
{ | ||
return $this->instances[$name] ?? $this->resolve($name); | ||
} | ||
|
||
/** | ||
* Resolve the given instance. | ||
* | ||
* @param string $name | ||
* @return mixed | ||
* | ||
* @throws \InvalidArgumentException | ||
*/ | ||
protected function resolve($name) | ||
{ | ||
$config = $this->getInstanceConfig($name); | ||
|
||
if (is_null($config)) { | ||
throw new InvalidArgumentException("Instance [{$name}] is not defined."); | ||
} | ||
|
||
if (isset($this->customCreators[$config['driver']])) { | ||
return $this->callCustomCreator($config); | ||
} else { | ||
$driverMethod = 'create'.ucfirst($config['driver']).'Driver'; | ||
|
||
if (method_exists($this, $driverMethod)) { | ||
return $this->{$driverMethod}($config); | ||
} else { | ||
throw new InvalidArgumentException("Instance driver [{$config['driver']}] is not supported."); | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* Call a custom instance creator. | ||
* | ||
* @param array $config | ||
* @return mixed | ||
*/ | ||
protected function callCustomCreator(array $config) | ||
{ | ||
return $this->customCreators[$config['driver']]($this->app, $config); | ||
} | ||
|
||
/** | ||
* Unset the given instances. | ||
* | ||
* @param array|string|null $name | ||
* @return $this | ||
*/ | ||
public function forgetInstance($name = null) | ||
{ | ||
$name = $name ?? $this->getDefaultInstance(); | ||
|
||
foreach ((array) $name as $instanceName) { | ||
if (isset($this->instances[$instanceName])) { | ||
unset($this->instances[$instanceName]); | ||
} | ||
} | ||
|
||
return $this; | ||
} | ||
|
||
/** | ||
* Disconnect the given instance and remove from local cache. | ||
* | ||
* @param string|null $name | ||
* @return void | ||
*/ | ||
public function purge($name = null) | ||
{ | ||
$name = $name ?? $this->getDefaultInstance(); | ||
|
||
unset($this->instances[$name]); | ||
} | ||
|
||
/** | ||
* Register a custom instance creator Closure. | ||
* | ||
* @param string $name | ||
* @param \Closure $callback | ||
* @return $this | ||
*/ | ||
public function extend($name, Closure $callback) | ||
{ | ||
$this->customCreators[$name] = $callback->bindTo($this, $this); | ||
|
||
return $this; | ||
} | ||
|
||
/** | ||
* Dynamically call the default instance. | ||
* | ||
* @param string $method | ||
* @param array $parameters | ||
* @return mixed | ||
*/ | ||
public function __call($method, $parameters) | ||
{ | ||
return $this->instance()->$method(...$parameters); | ||
} | ||
} |