143 lines
2.8 KiB
PHP
Executable File
143 lines
2.8 KiB
PHP
Executable File
<?php namespace Illuminate\Support;
|
|
|
|
use Closure;
|
|
use InvalidArgumentException;
|
|
|
|
abstract class Manager {
|
|
|
|
/**
|
|
* The application instance.
|
|
*
|
|
* @var \Illuminate\Foundation\Application
|
|
*/
|
|
protected $app;
|
|
|
|
/**
|
|
* The registered custom driver creators.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $customCreators = array();
|
|
|
|
/**
|
|
* The array of created "drivers".
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $drivers = array();
|
|
|
|
/**
|
|
* Create a new manager instance.
|
|
*
|
|
* @param \Illuminate\Foundation\Application $app
|
|
* @return void
|
|
*/
|
|
public function __construct($app)
|
|
{
|
|
$this->app = $app;
|
|
}
|
|
|
|
/**
|
|
* Get the default driver name.
|
|
*
|
|
* @return string
|
|
*/
|
|
abstract public function getDefaultDriver();
|
|
|
|
/**
|
|
* Get a driver instance.
|
|
*
|
|
* @param string $driver
|
|
* @return mixed
|
|
*/
|
|
public function driver($driver = null)
|
|
{
|
|
$driver = $driver ?: $this->getDefaultDriver();
|
|
|
|
// 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)
|
|
{
|
|
$method = 'create'.ucfirst($driver).'Driver';
|
|
|
|
// We'll check to see if a creator method exists for the given driver. If not we
|
|
// will check for a custom driver creator, which allows developers to create
|
|
// drivers using their own customized driver creator Closure to create it.
|
|
if (isset($this->customCreators[$driver]))
|
|
{
|
|
return $this->callCustomCreator($driver);
|
|
}
|
|
elseif (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->app);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* Dynamically call the default driver instance.
|
|
*
|
|
* @param string $method
|
|
* @param array $parameters
|
|
* @return mixed
|
|
*/
|
|
public function __call($method, $parameters)
|
|
{
|
|
return call_user_func_array(array($this->driver(), $method), $parameters);
|
|
}
|
|
|
|
}
|