You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

243 lines
5.2 KiB

<?php
declare(strict_types=1);
/*
* This file is part of Laravel Manager.
*
* (c) Graham Campbell <graham@alt-three.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace GrahamCampbell\Manager;
use Closure;
use Illuminate\Contracts\Config\Repository;
use InvalidArgumentException;
/**
* This is the abstract manager class.
*
* @author Graham Campbell <graham@alt-three.com>
*/
abstract class AbstractManager implements ManagerInterface
{
/**
* The config instance.
*
* @var \Illuminate\Contracts\Config\Repository
*/
protected $config;
/**
* The active connection instances.
*
* @var object[]
*/
protected $connections = [];
/**
* The custom connection resolvers.
*
* @var callable[]
*/
protected $extensions = [];
/**
* Create a new manager instance.
*
* @param \Illuminate\Contracts\Config\Repository $config
*
* @return void
*/
public function __construct(Repository $config)
{
$this->config = $config;
}
/**
* Get a connection instance.
*
* @param string|null $name
*
* @return object
*/
public function connection(string $name = null)
{
$name = $name ?: $this->getDefaultConnection();
if (!isset($this->connections[$name])) {
$this->connections[$name] = $this->makeConnection($name);
}
return $this->connections[$name];
}
/**
* Reconnect to the given connection.
*
* @param string|null $name
*
* @return object
*/
public function reconnect(string $name = null)
{
$name = $name ?: $this->getDefaultConnection();
$this->disconnect($name);
return $this->connection($name);
}
/**
* Disconnect from the given connection.
*
* @param string|null $name
*
* @return void
*/
public function disconnect(string $name = null)
{
$name = $name ?: $this->getDefaultConnection();
unset($this->connections[$name]);
}
/**
* Create the connection instance.
*
* @param array $config
*
* @return object
*/
abstract protected function createConnection(array $config);
/**
* Make the connection instance.
*
* @param string $name
*
* @return object
*/
protected function makeConnection(string $name)
{
$config = $this->getConnectionConfig($name);
if (isset($this->extensions[$name])) {
return $this->extensions[$name]($config);
}
if ($driver = array_get($config, 'driver')) {
if (isset($this->extensions[$driver])) {
return $this->extensions[$driver]($config);
}
}
return $this->createConnection($config);
}
/**
* Get the configuration name.
*
* @return string
*/
abstract protected function getConfigName();
/**
* Get the configuration for a connection.
*
* @param string|null $name
*
* @throws \InvalidArgumentException
*
* @return array
*/
public function getConnectionConfig(string $name = null)
{
$name = $name ?: $this->getDefaultConnection();
$connections = $this->config->get($this->getConfigName().'.connections');
if (!is_array($config = array_get($connections, $name)) && !$config) {
throw new InvalidArgumentException("Connection [$name] not configured.");
}
$config['name'] = $name;
return $config;
}
/**
* Get the default connection name.
*
* @return string
*/
public function getDefaultConnection()
{
return $this->config->get($this->getConfigName().'.default');
}
/**
* Set the default connection name.
*
* @param string $name
*
* @return void
*/
public function setDefaultConnection(string $name)
{
$this->config->set($this->getConfigName().'.default', $name);
}
/**
* Register an extension connection resolver.
*
* @param string $name
* @param callable $resolver
*
* @return void
*/
public function extend(string $name, callable $resolver)
{
if ($resolver instanceof Closure) {
$this->extensions[$name] = $resolver->bindTo($this, $this);
} else {
$this->extensions[$name] = $resolver;
}
}
/**
* Return all of the created connections.
*
* @return object[]
*/
public function getConnections()
{
return $this->connections;
}
/**
* Get the config instance.
*
* @return \Illuminate\Contracts\Config\Repository
*/
public function getConfig()
{
return $this->config;
}
/**
* Dynamically pass methods to the default connection.
*
* @param string $method
* @param array $parameters
*
* @return mixed
*/
public function __call(string $method, array $parameters)
{
return $this->connection()->$method(...$parameters);
}
}