haszi/dicontainer

此包的最新版本(1.0.0)没有可用的许可证信息。

PSR-11 兼容的依赖注入容器的学习练习

1.0.0 2023-10-28 12:52 UTC

This package is auto-updated.

Last update: 2024-09-28 15:44:35 UTC


README

这是一个基本的 PSR-11 兼容依赖注入容器,旨在学习对象组合、生命周期管理和 DIC 提供的拦截概念和实现。已实现基本对象组合和生命周期管理功能(请参阅功能限制),不支持对管理对象调用的拦截。

需求

PHP 8.0+

安装

使用 Composer 安装

composer require haszi/dicontainer

入门

创建容器

use haszi\DI\Container;

$container = new Container();

PSR-11 兼容性

if ($container->has('MyClass')) {
  $myObject = $container->get('MyClass');
}

注册临时服务

临时服务(每次从容器获取时都返回一个新实例)可以使用表示类名的字符串或闭包进行注册。

类名

$container->set('comment', Comment::class);

闭包

$container->set(Comment::class, function () {
  return new Comment();
});

注册共享服务

共享服务(每次从容器获取时都返回相同实例)可以使用表示类名的字符串、闭包或已实例化的对象进行注册。所有共享服务对象都是首次使用时懒加载初始化的。

类名

$container->setShared('database', DatabaseConnection::class);

闭包

$container->setShared(DatabaseConnection::class, function () {
  return new DatabaseConnection();
});

已实例化的对象

$db = new DatabaseConnection();

$container->setShared(DatabaseConnection::class, $db);

注册作用域服务

作用域服务与共享服务相同,区别在于可以清除实例化的对象而不注销服务本身。作用域服务的常见用途是事件循环中的请求对象。

类名

$container->setScoped('request', Request::class);

闭包

$container->setScoped(Request::class, function () {
  return new Request();
});

已实例化的对象

$request = new Request();

$container->setScoped(Request::class, $request);

清除已初始化的作用域对象

$container->unsetScopedInstances(Request::class);

注销服务

$container->unset(DatabaseConnection::class);

功能

支持

  • 对象组合
    • 构造函数注入
      • 自动绑定
  • 生命周期管理
    • 临时服务(每次获取请求返回新对象)
    • 共享服务(每次获取请求返回相同对象)
    • 作用域服务(每次获取请求返回相同对象,且实例化的对象是可丢弃的)

不支持

  • 对象组合
    • 设置器和属性注入
    • 注入
      • 联合和交集类型
      • 向内置类型(数组、可调用、布尔值、浮点数、整数、字符串、迭代器、对象、混合)传递值
  • 拦截