一 前置了解。
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 即可。