Код: Выделить всё
$appConfig = [...];
$config1 = $appConfig['mysql'];
$config2 = $appConfig['mssql'];
$builder = new ContainerBuilder();
$containerBuilder->useAttributes(true);
$builder->addDefinitions([
'mysql' => factory(fn(ContainerInterface $c) => new PDO('...', $config1['user'], $config1['pass'])),
'mssql' => factory(fn(ContainerInterface $c) => new PDO('...', $config2['user'], $config2['pass'])),
]);
Код: Выделить всё
class MyClass
{
private PDO $mysql;
private PDO $mssql;
#[Inject(['mysql', 'mssql'])]
public function __construct(PDO $mysql, PDO $mssql)
{
$this->mysql = $mysql;
$this->mssql = $mssql;
}
public function foo()
{
$ps = $this->mysql->prepare('...');
$ps->execute();
return $ps->fetchAll();
}
public function bar()
{
$ps = $this->mssql->prepare('...');
$ps->execute();
return $ps->fetchAll();
}
}
Теперь я мог бы сделать что-то подобное для каждого соединения:
Код: Выделить всё
class MySql
{
private array $config;
private ?PDO $pdo = null;
#[Inject('appconfig')]
public function __construct(array $appConfig)
{
$this->config = $appConfig['mysql'];
}
public function getPdo(): PDO
{
if (is_null($this->pdo))
$this->pdo = new PDO('...', $this->config['user'], $this->config['pass']);
return $this->pdo;
}
}
Код: Выделить всё
$builder->addDefinitions([
'mysql' => autowire(MySql::class)->lazy(),
'mssql' => autowire(MsSql::class)->lazy(),
]);
Есть ли способ использовать отложенную загрузку на моих фабриках, чтобы избежать использования автоматического подключения?
ПРИМЕЧАНИЕ. Отложенная загрузка PHP DI работает с использованием прокси-серверов для отложенно загруженных объектов. Интересно, будет ли потенциальное решение моего сценария включать возврат прокси из фабричного метода.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -factories
Мобильная версия