1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- <?php
- declare(strict_types=1);
- /**
- * This file is part of Hyperf.
- *
- * @link https://www.hyperf.io
- * @document https://hyperf.wiki
- * @contact group@hyperf.io
- * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
- */
- namespace Hyperf\DbConnection;
- use Hyperf\Context\Context;
- use Hyperf\Coroutine\Coroutine;
- use Hyperf\Database\ConnectionInterface;
- use Hyperf\Database\ConnectionResolverInterface;
- use Hyperf\DbConnection\Pool\PoolFactory;
- use Psr\Container\ContainerInterface;
- use function Hyperf\Coroutine\defer;
- class ConnectionResolver implements ConnectionResolverInterface
- {
- /**
- * The default connection name.
- */
- protected string $default = 'default';
- protected PoolFactory $factory;
- public function __construct(protected ContainerInterface $container)
- {
- $this->factory = $container->get(PoolFactory::class);
- }
- /**
- * Get a database connection instance.
- */
- public function connection(?string $name = null): ConnectionInterface
- {
- if (is_null($name)) {
- $name = $this->getDefaultConnection();
- }
- $connection = null;
- $id = $this->getContextKey($name);
- if (Context::has($id)) {
- $connection = Context::get($id);
- }
- if (! $connection instanceof ConnectionInterface) {
- $pool = $this->factory->getPool($name);
- $connection = $pool->get();
- try {
- // PDO is initialized as an anonymous function, so there is no IO exception,
- // but if other exceptions are thrown, the connection will not return to the connection pool properly.
- $connection = $connection->getConnection();
- Context::set($id, $connection);
- } finally {
- if (Coroutine::inCoroutine()) {
- defer(function () use ($connection, $id) {
- Context::set($id, null);
- $connection->release();
- });
- }
- }
- }
- return $connection;
- }
- /**
- * Get the default connection name.
- */
- public function getDefaultConnection(): string
- {
- return $this->default;
- }
- /**
- * Set the default connection name.
- */
- public function setDefaultConnection(string $name): void
- {
- $this->default = $name;
- }
- /**
- * The key to identify the connection object in coroutine context.
- * @param mixed $name
- */
- private function getContextKey($name): string
- {
- return sprintf('database.connection.%s', $name);
- }
- }
|