Могу ли я использовать отложенную загрузку с фабриками?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Могу ли я использовать отложенную загрузку с фабриками?

Сообщение Anonymous »

У меня есть проект, который автоматически устанавливает привязки зависимостей (с использованием PHP-DI) для различных подключений к базе данных на основе источников данных, определенных в файле конфигурации:

Код: Выделить всё

// In reality this is loaded from a file
$configuration = [
'ds-mysql' => [
'type' => 'mysql',
'host' => '0.0.0.0',
'user' => 'example',
'pass' => 'example'
],
'ds-mongo' => [
'type' => 'mongodb',
'host' => '0.0.0.0',
'port' => 27017,
'user' => 'example',
'pass' => 'example'
],
// ...
];

$builder = new ContainerBuilder();
$builder->useAnnotations(true);
$builder->addDefinitions([
DatasourceService::class => factory(
fn() =>
new DatasourceService(
new Db2Connector(),
new MysqlConnector(),
new SqlServerConnector(),
new MongoConnector()
)
)
// Other bindings ...
]);

$datasources = [];
foreach ($configuration as $key => $value) {
if (StringUtils::stringStartsWith($key, 'ds-')) {
$datasources[$key] = factory(
fn(ContainerInterface $c) =>
$c->get(DatasourceService::class)->getConnection($key, $value)
);
}
}
$builder->addDefinitions($datasources);
Этот код включен в другие мои проекты в виде пакета композитора и позволяет мне внедрять источники данных в различные классы без настройки каких-либо других определений контейнеров. Например:

Код: Выделить всё

use MongoDB\Client;

class DocumentRepository {

private Client $client;

#[Inject(['ds-mongo'])]
public function __construct(Client $client)
{
$this->client = $client;
}

}

// ...

use PDO;

class RelationalRepository {

private PDO $pdo;

#[Inject(['ds-mysql'])]
public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}

}
Проблема, с которой я столкнулся, заключается в том, что иногда несколько классов «репозитория» автоматически подключаются к некоторому классу обслуживания, который не гарантирует, что они оба будут использоваться для обработки запроса. Тем не менее, автоматическое подключение заставляет оба источника данных устанавливать соединения (с этим связаны определенные накладные расходы).
Из-за этого мне фактически приходится создавать определения контейнеров для моих репозиториев, чтобы сделать их ленивой загрузкой:

Код: Выделить всё

$builder->addDefinitions([
RelationalRepository::class => autowire(RelationalRepository::class)->lazy(),
DocumentRepository::class => autowire(DocumentRepository ::class)->lazy()
]);
Я хотел бы избавить себя от необходимости вручную определять каждый репозиторий в контейнере, вместо этого настроив общий код для отложенной загрузки. Однако общий код использует фабрики для определения различных источников данных, а PHP-DI, похоже, не поддерживает отложенную загрузку с помощью функции DI\factory.
За кулисами PHP-DI использует прокси для отложенной загрузки. Я бы хотел, чтобы мои экземпляры PDO и MongoDB\Client также вводились в качестве прокси. Есть ли какой-нибудь способ добиться этого с помощью нынешнего подхода к фабрикам?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -factories
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»