先別看懂,先閱讀,在後半部分講解這個是幹嘛的。其實這個我們平時在其它框架裏很常用,就是不知道它的名字叫做依賴注入。
爲了本地和linux虛擬機實現愉快的同步代碼,所以可藉助WinSCP 本地文件與服務器自動同步
我將框架拉到了本地
都選中根目錄
然後就可以在本地用編輯器直接編輯與新建文件了,將會自動同步到linux。主要是爲了能按Ctrl
看路徑。
正文
假設我們需要在 IndexController
內調用 UserService
類的 getInfoById(int $id)
方法。
App\Service\UserService.php
<?php
namespace App\Service;
class UserService
{
public function getInfoById(int $id)
{
return $id;
}
}
通過構造方法注入,該例子只是便於理解,無需重視
App\Controller\IndexController.php
<?php
namespace App\Controller;
use App\Service\UserService;
use Hyperf\HttpServer\Annotation\AutoController;
/**
* @AutoController()
*/
class IndexController
{
/**
* @var UserService
*/
private $userService;
// 通過在構造函數的參數上聲明參數類型完成自動注入
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
public function index()
{
$id = 123;
// 直接使用
return $this->userService->getInfoById($id);
}
}
http://192.168.1.109:9501/index/index
通過 @Inject 註解注入
<?php
namespace App\Controller;
use App\Service\UserService;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\AutoController;
/**
* @AutoController()
*/
class IndexController
{
/**
* 通過 `@Inject` 註解注入由 `@var` 註解聲明的屬性類型對象
*
* @Inject
* @var UserService
*/
private $userService;
public function index()
{
$id = 2333;
// 直接使用
return $this->userService->getInfoById($id);
}
}
http://192.168.1.109:9501/index/index
注意到了嗎?其實就是調用了某個類。
箭頭所指都是同一個類。
其實就是使你不需要去new而已,通過@var直接可在index控制器中使用某個類。
而構造方法的方式沒有用到@Inject,所以需要通過構造方法初始化賦值。
通過加入@Inject
註解,就可以不使用構造方法也可達到效果。