123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- <?php
- namespace Illuminate\Support;
- use Closure;
- use Illuminate\Contracts\Container\Container;
- use InvalidArgumentException;
- abstract class Manager
- {
- /**
- * The container instance.
- *
- * @var \Illuminate\Contracts\Container\Container
- */
- protected $container;
- /**
- * The configuration repository instance.
- *
- * @var \Illuminate\Contracts\Config\Repository
- */
- protected $config;
- /**
- * The registered custom driver creators.
- *
- * @var array
- */
- protected $customCreators = [];
- /**
- * The array of created "drivers".
- *
- * @var array
- */
- protected $drivers = [];
- /**
- * Create a new manager instance.
- *
- * @param \Illuminate\Contracts\Container\Container $container
- * @return void
- */
- public function __construct(Container $container)
- {
- $this->container = $container;
- $this->config = $container->make('config');
- }
- /**
- * Get the default driver name.
- *
- * @return string
- */
- abstract public function getDefaultDriver();
- /**
- * Get a driver instance.
- *
- * @param string|null $driver
- * @return mixed
- *
- * @throws \InvalidArgumentException
- */
- public function driver($driver = null)
- {
- $driver = $driver ?: $this->getDefaultDriver();
- if (is_null($driver)) {
- throw new InvalidArgumentException(sprintf(
- 'Unable to resolve NULL driver for [%s].', static::class
- ));
- }
- // If the given driver has not been created before, we will create the instances
- // here and cache it so we can return it next time very quickly. If there is
- // already a driver created by this name, we'll just return that instance.
- if (! isset($this->drivers[$driver])) {
- $this->drivers[$driver] = $this->createDriver($driver);
- }
- return $this->drivers[$driver];
- }
- /**
- * Create a new driver instance.
- *
- * @param string $driver
- * @return mixed
- *
- * @throws \InvalidArgumentException
- */
- protected function createDriver($driver)
- {
- // First, we will determine if a custom driver creator exists for the given driver and
- // if it does not we will check for a creator method for the driver. Custom creator
- // callbacks allow developers to build their own "drivers" easily using Closures.
- if (isset($this->customCreators[$driver])) {
- return $this->callCustomCreator($driver);
- }
- $method = 'create'.Str::studly($driver).'Driver';
- if (method_exists($this, $method)) {
- return $this->$method();
- }
- throw new InvalidArgumentException("Driver [$driver] not supported.");
- }
- /**
- * Call a custom driver creator.
- *
- * @param string $driver
- * @return mixed
- */
- protected function callCustomCreator($driver)
- {
- return $this->customCreators[$driver]($this->container);
- }
- /**
- * Register a custom driver creator Closure.
- *
- * @param string $driver
- * @param \Closure $callback
- * @return $this
- */
- public function extend($driver, Closure $callback)
- {
- $this->customCreators[$driver] = $callback;
- return $this;
- }
- /**
- * Get all of the created "drivers".
- *
- * @return array
- */
- public function getDrivers()
- {
- return $this->drivers;
- }
- /**
- * Get the container instance used by the manager.
- *
- * @return \Illuminate\Contracts\Container\Container
- */
- public function getContainer()
- {
- return $this->container;
- }
- /**
- * Set the container instance used by the manager.
- *
- * @param \Illuminate\Contracts\Container\Container $container
- * @return $this
- */
- public function setContainer(Container $container)
- {
- $this->container = $container;
- return $this;
- }
- /**
- * Forget all of the resolved driver instances.
- *
- * @return $this
- */
- public function forgetDrivers()
- {
- $this->drivers = [];
- return $this;
- }
- /**
- * Dynamically call the default driver instance.
- *
- * @param string $method
- * @param array $parameters
- * @return mixed
- */
- public function __call($method, $parameters)
- {
- return $this->driver()->$method(...$parameters);
- }
- }
|