Конфигурация ContainerBuilder
Основная конфигурация хранится, в скрипте по генерации контейнера.
bin/build.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
$fqcn = 'App\Container';
$filename = __DIR__ . '/../src/Container.php';
file_put_contents(
$filename,
(new \Cekta\DI\ContainerBuilder(
fqcn: $fqcn,
entries: [\App\Example::class],
// you configuration here, like entries, params, alias, etc.
))->build()
);
Здесь вы можете задать следующие параметры
FQCN
Полное имя класса (namespace + class_name). Из FQCN эти параметры будут извлечены.
FILENAME
Полный путь до файла где он будет сохранен Container.
Крайне желательно чтобы файл располагался вместе где он будет доступен с помощью автозагрузки классов composer, с учетом его fqcn и физического расположения.
entries
Массив строк, где каждая строка это основная точки входа которая должна быть разрешима с помощью Container.
На этапе build, Container использует эти зависимости и пытается их разрешить с помощью конфигурации (других параметров) или autowiring в конструктор.
Вы можете сгенерировать список этих точек входа, на основе содержимого вашего проекта, например все классы реализующие Psr\Http\Server\RequestHandlerInterface или имеющие php attribute.
params
Основные параметры которые можно внедрять в зависимости.
params: [
'Имя зависимости в локальном или глобальном именование' => 'Значение',
\PDO::class . '$dsn' => 'sqlite:./db.sqlite', // локальное имя, только для PDO аргумент с именем dsn будет иметь значение ...
'username' => 'root', // глобальное имя, всем кому потребуется username, будет использовано это значение.
]
Параметры можно задавать глобально и локально.
Рекомендую задавать параметры для конкретной зависимости(локально).
Например можно задавать dsn, username, password и тд.
alias
С помощью данного параметра можно заменить одну зависимость на другую.
alias: [
I::class => R2::class, // Глобальное имя
// Есть возможность задавать и локальные имена!
]
Вместо I::class будет использоваться R2::class, например так можно регистрировать реализацию интерфейса для всего проекта.
Alias можно задавать глобально и локально.
Чаще всего их задают глобально для всего проекта.
singletons
Позволяет управлять жизненным циклом зависимостей.
В singletons указываются зависимости, которые должны иметь жизненный цикл singleton, а именно создаваться в единичном экземпляре за все время жизни скрипта.
factories
Позволяет управлять жизненным циклом зависимости.
В factories указываются зависимости, которые должны иметь жизненный цикл factories, а именно создается каждый раз новый экземпляр.