123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- namespace Illuminate\Support;
- use Closure;
- use InvalidArgumentException;
- use RuntimeException;
- 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 (! array_key_exists('driver', $config)) {
- throw new RuntimeException("Instance [{$name}] does not specify a driver.");
- }
- 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 ??= $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 ??= $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);
- }
- }
|