Hyperf 依赖注入.

510 阅读1分钟

一 前置了解。

1.1 Ioc

Ioc 控制反转 ,对象的调用权交给容器,通过窗口来实现对象的装配和管理

1.2 Di

Di 依赖注入,对象之前的依赖关系由容器在运行期决定,由窗口动态的将依赖关系注入到对象之中。

1.3 Hyperf 由 hyperf/di 组件提供功能支持。

提供注解,注解注入,AOP

二 Hyperf 如何实现注入。

2.1 实现简单注入。

准备服务类

<?php
namespace App\Service;
class UserService {
    public function getInfoById(int $id)
    {
        return "UserService:$id";
    }

}

2.1.1 方法一,构造器注入

<?php
declare(strict_types=1);
namespace App\Controller;

use App\Service\UserService;
use Hyperf\HttpServer\Annotation\AutoController;
/**
 * @AutoController(prefix="di")
 */

class DemoDiController extends AbstractController
{

    /**
     * @var UserService
     */
    private $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    public function index()
    {
        return $this->userService->getInfoById(5);
    }

}

curl 127.0.0.1:9501/di/index UserService:5

2.1.2 方法2 使用@inject

   //把控制器构造函数删掉,换成如下代码即可。

    /**
     * @inject
     * @var UserService
     */
    private $userService;

2.2 抽象对象注入。

2.2.1 定义接口与实现 。

interface IUserService {
    public function getInfoById(int $id);
}


class UserService implements IUserService {
    public function getInfoById(int $id)
    {
        return "by injectUserService:$id";
    }
}

2.2.2 定义依赖配置关系.

//config\autoload\dependencies.php
use \App\Service\IUserService;
use \App\Service\UserService;

return [
    IUserService::class => UserService::class
];

2.2.3 注入并使用。

/**
 * @inject
 * @var IUserService
 */
private $userService;

public function index()
{
    return $this->userService->getInfoById(5);
}

抽象了一层,业务实现是基于IUserService 的实现 ,当需要更换时,直接改下dependencies.php 即可。

2.3 更复杂的场景。(传递参数 【应用参数,来自配置,非请求参数】)