bogdanpet / orthite-di
简单的依赖注入容器
v1.0.3-stable
2018-09-04 15:15 UTC
This package is not auto-updated.
Last update: 2024-09-26 19:19:59 UTC
README
简单的依赖注入容器
安装
composer require bogdanpet/orthite-di
用法
自动解析类
例如,假设我们有一个模型 User,它依赖于 Request 和 Database 对象,而 Database 类依赖于 PDO。
<?php class User { public function __construct(Request $request, Database $db) { . . . } }
<?php class Database { public function __construct(\PDO $pdo) { . . . } }
<?php class Request { . . . }
没有 DI,创建 $user 对象将看起来像这样。
$request = new Request(); $pdo = new PDO($dsn, $username, $passwd); $db = new Database($pdo); $user = new User($request, $db);
现在想象一下,如果有更多的依赖关系和更多的依赖。这就是自动解析发挥作用的地方。你只需要调用容器的 get() 方法。如果对象不在定义容器中,将尝试使用 类型提示 来解析它。
$container = Orthite\DI\Container::getInstance(); $user = $container->get(User::class);
容器将递归地尝试解析所有类。这个问题在于 PDO 依赖于 dsn、用户名和密码输入,这些无法解析。所以仍然可以传递一些用户定义的参数。传递参数数组,容器将知道在哪里放置它们。请记住,数组键必须与参数名称匹配。
$user = $container->get(User::class, [ 'dsn' => $dsn, 'username' => $username, 'passwd' => $passwd ]);
或者
$user = $container->get(User::class, compact('dsn', 'username', 'passwd');
假设你已定义了变量 $dsn、$username 和 $passwd。
如果不想实例化容器单例,包还提供了一个 container() 辅助函数。这将在函数内部自动完成。
// No previous instantiation of container is required. $user = container(User::class, compact('dsn', 'username', 'passwd');
从类中调用方法
与解析类的方法相同,也可以解析类中的方法。例如,假设类 User 有一个 show 方法,用于显示用户账户详细信息,并且它依赖于用户 ID 和 Response 类。
<?php class User { public function __construct(Request $request, Database $db) { . . . } public function show(Response $response, $id) { . . . return $response(...$something); } }
可以使用容器的 call() 方法来调用方法,容器将负责解析类和方法依赖。
$container = Orthite\DI\Container::getInstance(); $response = $container->call(User::class, 'show', ['id' => 1]); echo $response; // or whatever
或者使用辅助函数 cintainer_call()
$response = container_call(User::class, 'show', ['id' => 1]); echo $response; // or whatever