Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Params (Параметры)

Параметры позволяют задавать конкретные значения для аргументов зависимостей:

  • Встроенные типы (string, int, array и т.д.)
  • Переопределять значение по умолчанию
  • Конкретные экземпляры объектов (например если вы создали $logger вы можете использовать его и дальше)

Некоторые параметры могут разрешаться в момент использования, а не во время build Container, такие параметры называются Lazy (ленивые). С помощью таких параметров можно реализовать свою callback функцию, которая будет генерировать зависимость в особо сложных случаях. Подробней о Lazy (ленивых) параметрах.

Пример

src/Example.php

<?php

namespace App;

class Example
{
    public function __construct(public string $username, public string $password){}
}

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],
        params: [
            'username' => 'some username', // глобальное имя, всем кому потребуется username, будет использовано это значение.
            \App\Example::class . '$password' => 'some password', // локальное имя, только для Example, аргумент с именем password будет иметь значение ...
        ]
    ))->build()
);

Параметры можно задавать глобально и локально.
Рекомендую задавать параметры для конкретной зависимости(локально).

Генерируем Container - build

php bin/build.php

index.php - usage

<?php

declare(strict_types=1);

require_once __DIR__ . '/../vendor/autoload.php';

$params = []; // you current params
$container = new \App\Container([
    'username' => 'actual username',
    \App\Example::class . '$password' => 'actual password',
]);
$example = $container->get(\App\Example::class);

assert($example->username === 'actual username');
assert($example->password === 'actual password');

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

Параметры, что использовались на этапе build считаются обязательными для создания Container, если вы их не передадите, получите соответствующее исключение.

Использовались != были объявлены. Использовались это значит они применялись для разрешения entries.