Определения в внедрении зависимостей через php-di - PullRequest
2 голосов
/ 05 июня 2019

Завязывание моей головы вокруг внедрения зависимостей с помощью php-di, но я, очевидно, что-то не так делаю правильно.Хотите знать, если кто-то может сказать мне, что я делаю не так.

Хорошо, есть файл bootstrap.php, в нем нет пространства имен, и он выглядит примерно так:

`<?php

use myapp\app;
use myapp\interfaces\db;
use Psr\Log\LoggerInterface;
use myapp\lib\log;
/// A bunch more 'use' statements here ///


// Start app.  The myapp\loader() class extends DI\Container, hence is also the HTTP container.
$app = new myapp\loader();

// Set classes
$app->set(app::class, $app);
$app->set(loggerInterface::class, $app->make(log::class, ['channel_name' => 'some_changeable_name']));
$app->set(db::class, $app->make(myapp\lib\mysql::class));

// Return
return $app;

ЯЯ уверен, что вы, по крайней мере, видите, что я пытаюсь сделать, и это технически работает, хотя я уверен, что я делаю это неправильно.

Я хочу, чтобы это было взаимозаменяемо, например, выможет легко отключить интернет-регистратор для пакета monolog / monolog, или изменить имя канала журнала по умолчанию, или перевернуть драйвер базы данных на какой-либо другой класс, кроме mysql и т. д.

Однако эти классы зависят друг от друга, следовательно, должны быть установлены в этом порядке, и если помещено в метод ContainerBuilder-> AddDefinitions (), он просто выдает ошибку, говоря, что app :: class не может быть решен.Например, в конструктор log :: class вставлен 'app: class', в конструктор для db :: class введены app :: class и loggerInterface :: class и т. Д. Кроме того, мне нужно иметь возможностьпри их определении включайте параметры, основанные на именах.

Любое понимание будет полезным, так как я очень сомневаюсь, что это лучший способ сделать это, даже если он работает.Я должен вводить только контейнер в каждый из этих вызовов, а затем захватить необходимые объекты / классы с помощью метода container-> get ()?Хотя было бы намного приятнее и легче читать, если бы я мог просто вставить это непосредственно в конструктор.

Любая помощь / понимание будет высоко ценится.

...