1. Go to this page and download the library: Download ifcastle/di library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
ifcastle / di example snippets
declare(strict_types=1);
use IfCastle\DI\ContainerBuilder;
use IfCastle\DI\Lazy;
readonly class SomeClass implements SomeInterface
{
public function __construct(
// Required dependency
private SomeRequiredInterface $cy type with interception
private Interface1&Interface2 $someElseInterception,
// Dependency as configuration value
private int $configValue = 42,
) {}
}
// 1. Create a container builder
$builder = new ContainerBuilder();
// 2. Define the constructible dependencies
$builder->bindConstructible(SomeInterface::class, SomeClass::class);
// 2. Bind several interfaces-aliases or string-key to one class
$builder->bindConstructible([Interface1::class, Interface2::class, 'string-key'], SomeElseClass::class);
// 2. Support WeakReference dereferencing
$builder->bindObject(SomeOptionalInterface::class, WeakReference::create($someObject));
// 2. Define the configuration values
$builder->set('configValue', 42);
// 3. Build the container
$container = $builder->buildContainer(new Resolver());
// 4. Get the dependency
$some = $container->resolveDependency(SomeInterface::class);
use IfCastle\DI\Dependency;
use IfCastle\DI\FromConfig;
readonly class SomeClass implements SomeInterface
{
public function __construct(
#[Dependency(key: SomeRequiredInterface::class)]
private mixed $
use IfCastle\DI\Lazy;
readonly class SomeClass implements SomeInterface
{
public function __construct(
#[Lazy] private SomeRequiredInterface $lazy,
) {}
}
> readonly class SomeClass implements SomeInterface
> {
> public function __construct(
> #[Lazy] private SomeRequiredInterface $lazy,
> ) {
> $lazy->someMethod(); // Error: CircularDependencyException
> }
> }
>
#[\Override]
public function provide(
ContainerInterface $container,
DescriptorInterface $descriptor,
?DependencyInterface $forDependency = null,
array $resolvingKeys = []
): mixed {
$config = $container->findDependency(ConfigInterface::class);
if ($config === null) {
return null;
}
if ($config instanceof ConfigInterface === false) {
throw new \TypeError('Config is not an instance of ' . ConfigInterface::class);
}
return $config->findValue($this->getKey());
}
declare(strict_types=1);
use IfCastle\DI\DependencyContract;
#[DependencyContract(new DependencyProvider())]
interface InterfaceWithDependencyContact
{
public function someMethod(): void;
}
final readonly class ClassWithDependencyContact
{
public function __construct(
private InterfaceWithDependencyContact $some
) {}
}
use IfCastle\DI\Container;
$parent = new Container(new Resolver(), ['dependency1' => 'value1']);
$child = new Container(new Resolver(), ['dependency1' => 'value2'], $parent);
echo $child->resolveDependency('dependency1'); // value2
use IfCastle\DI\ContainerBuilder;
use IfCastle\DI\ContainerInterface;
$builder = new ContainerBuilder();
// Constructible dependencies
$builder->bindConstructible(SomeInterface::class, SomeClass::class);
// Injectable dependencies
$builder->bindInjectable(SomeRequiredInterface::class, SomeRequiredClass::class);
// Bind to Initializer
$builder->bindInitializer(SomeOptionalInterface::class, static function (?ContainerInterface $container = null, array $resolvingKeys = []) {
return $container->resolveDependency(SomeOptionalInterface::class, resolvingKeys: $resolvingKeys);
});
// Bind to Object
$builder->bindObject('stdClass', new stdClass());
// 3. Build the container
$container = $builder->buildContainer(new Resolver());
use Attribute;
use IfCastle\DI\Dependency;
use IfCastle\DI\DescriptorInterface;
use IfCastle\DI\DescriptorProviderInterface;
#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
final class CustomDescriptor extends Dependency implements DescriptorProviderInterface
{
#[\Override]
public function getDescriptorProvider(): DescriptorProviderInterface|null
{
return $this;
}
#[\Override]
public function provideDescriptor(
DescriptorInterface $descriptor,
\ReflectionClass $reflectionClass,
\ReflectionParameter|\ReflectionProperty $reflectionTarget,
object|string $object,
): DescriptorInterface {
// Custom logic here
}
}
use IfCastle\DI\DependencyContract;
// Define custom descriptor provider for the interface
#[DependencyContract(descriptorProvider: new DescriptorProvider())]
interface InterfaceWithDependencyContact
{
public function someMethod(): void;
}
final readonly class ClassWithDependencyContact
{
public function __construct(
private InterfaceWithDependencyContact $some
) {}
}
use IfCastle\DI\Dependency;
use IfCastle\DI\InjectableInterface;
use IfCastle\DI\InjectorTrait;
use IfCastle\DI\Lazy;
final class InjectableClass implements InjectableInterface
{
use InjectorTrait;
#[Dependency]
protected UseConstructorInterface $
declare(strict_types=1);
class DataBase
{
public function __construct(
private string $dsn,
private string $user,
private string $password,
private TelemetryCounterInterface $queryCounter,
private TelemetryCounterInterface $errorCounter,
) {}
}
// 1. Look up the registry
$registry = $container->resolveDependency(TelemetryRegistryInterface::class);
// 2. Register the counter
$counter = $registry->getOrRegisterCounter('test', 'some_counter', 'it increases', ['type']);
class TelemetryProvider implements \IfCastle\DI\ProviderInterface
{
public function provide(
ContainerInterface $container,
DescriptorInterface $descriptor,
?DependencyInterface $forDependency = null,
array $resolvingKeys = [],
): mixed
{
// Here, you can use the ReflectionAPI for more complex logic
// to determine counter-attributes
// based on knowledge about the class where they need to be injected.
$forClass = $forDependency->getDependencyName() ?? 'global';
$registry = $container->resolveDependency(TelemetryRegistryInterface::class);
return $registry->getOrRegisterCounter($forClass.'_'.$descriptor->getDependencyProperty());
}
}
#[\IfCastle\DI\DependencyContract(new TelemetryProvider())]
interface TelemetryCounterInterface
{
public function inc(): void;
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.