Код: Выделить всё
// 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 использует прокси для отложенной загрузки. Я бы хотел, чтобы мои экземпляры PDO и MongoDB\Client также вводились в качестве прокси. Есть ли какой-нибудь способ добиться этого с помощью нынешнего подхода к фабрикам?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -factories
Мобильная версия