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