## Bean
MixPHP 參考了 Java Spring 的依賴注入(DI)與控制反轉(IoC),具體實現就是通過 Bean 的方式,MixPHP 的實現是非常簡單高效的。
| 類 |
| --- |
| Mix\Core\Bean\AbstractObject |
整體實現分為幾個部分:
- 配置文件:`beans` 配置項負責描述依賴注入的結構關系。
- AbstractObject:抽象類 `AbstractObject ` 負責屬性導入與對象實例化。
## `beans` 配置項
應用配置文件中,有一個 `beans` 配置項,這里描述了框架使用的所有類的依賴關系。
`beans` 配置項是一個數組,其中每一個節點為一個 `bean` ,每個 `bean` 包含三個屬性:
- class:類的路徑,通常使用 ::class 的方式獲取
- name:默認等于 class 的值,通常只有在一個類需多次注入不同屬性時使用,需給相同的類定義不同的名稱。
- properties:需注入的屬性,內部的 key 將注入成類的屬性名稱,value 將賦值為屬性的值。
- ref:引用的另一個 `bean` 的 `name`,由于沒有配置 `name` 的 `bean` 默認會通過 `class` 生成一個名稱,所以框架提供了 `beanname` 方法方便用戶獲取默認名稱。
下面是一個授權組件的依賴關系配置:
~~~
// 依賴配置
'beans' => [
// Auth
[
// 類路徑
'class' => Mix\Auth\Authorization::class,
/**
名稱:通常不需要配置這個屬性,因為默認框架會生成一個 name,
值等于 beanname(class),只有在同一個類需要不同配置時才需自行配置名字,
這時就不需要使用 beanname 方法命名了,直接指定一個字符串的名稱即可,
在其他類中 ref 引用時,也不需要使用 beanname 方法。
// 默認生成的名稱
'name' => beanname(Mix\Auth\Authorization::class),
// 自定義名稱
'name' => 'newName',
*/
// 屬性
'properties' => [
// BearerToken
'bearerToken' => [
// 依賴引用
'ref' => beanname(Mix\Auth\BearerToken::class),
],
// jwt
'jwt' => [
// 依賴引用
'ref' => beanname(Mix\Auth\JWT::class),
],
],
],
// BearerToken
[
// 類路徑
'class' => Mix\Auth\BearerToken::class,
],
// jwt
[
// 類路徑
'class' => Mix\Auth\JWT::class,
// 屬性
'properties' => [
// 鑰匙
'key' => 'example_key',
// 簽名算法
'algorithm' => Mix\Auth\JWT::ALGORITHM_HS256,
],
],
],
~~~
## 通過依賴注入實例化
上文的授權組件的依賴關系配置中,由于 Authorization 繼承了 AbstractObject ,因此可以非常方便的實例化:
```
// 使用默認 beanname 實例化
$auth = Mix\Auth\Authorization::newInstance();
// 指定 beanname 實例化
$auth = Mix\Auth\Authorization::newInstance('beanname');
```
## AbstractObject
上面的依賴關系定義完成后,最終需要根據依賴注入到對象中,而完成注入工作的就是 AbstractObject 這個抽象類。
因此需要使用完整的依賴注入、控制反轉,必須要繼承該類,框架大部分類都繼承自 AbstractObject 這個抽象類。
### 第三方的類的依賴注入
通過使用 `Mix\Core\Bean\ObjectTrait` 手動處理第三方的類的依賴注入,代碼如下:
~~~php
class MyLibrary extends ThirdLibrary implements \Mix\Core\Bean\ObjectInterface
{
use Mix\Core\Bean\ObjectTrait;
// 如果需要接收配置,可以在這里手動處理,$properties 就是傳入的屬性信息
public function __construct($properties = [])
{
parent::__construct();
}
}
~~~
### AbstractObject 的事件
包含了三個事件:
- onConstruct:構造事件,相當于 __construct 方法。
- onInitialize:當完成構造事件并導入配置信息為屬性后觸發該事件,用于做一些初始化處理。
- onDestruct:析構事件,相當于 __destruct 方法。
使用時只需重寫這幾個事件方法即可。
~~~php
// 構造事件
public function onConstruct()
{
parent::onConstruct();
// ...
}
// 初始化事件
public function onInitialize()
{
parent::onInitialize();
// ...
}
// 析構事件
public function onDestruct()
{
parent::onDestruct();
// ...
}
~~~
- 歡迎使用 MixPHP
- 安裝說明
- 全量安裝
- Phar 命令行
- 入門須知
- 增改應用
- 命名空間
- 自動加載
- 入口文件
- 配置文件
- 服務開發
- 核心基礎
- Bean
- Component
- Application
- 命令行
- 簡介
- 命令行開發常識
- 命令行開發
- 創建命令
- 命令參數
- 打印與顏色
- 控制臺程序
- 守護程序
- HTTP 服務
- 簡介
- 服務器
- 路由
- 請求
- 響應
- 控制器
- 視圖
- Auth
- Session
- 文件上傳
- 其他組件
- 分頁
- 驗證碼
- 圖片處理
- 客戶端
- GuzzleHttp
- 雜項
- Apache/PHP-FPM部署
- 調試與錯誤
- 安全建議
- WebSocket 服務
- 簡介
- 服務器
- 注冊器
- 連接
- 客戶端
- 測試
- 雜項
- nginx代理
- 60s無消息斷線
- TCP 服務
- 簡介
- 服務器
- 客戶端
- 測試
- UDP 服務
- 簡介
- 服務器
- 客戶端
- 測試
- 協程
- 簡介
- 開啟協程
- PHP Stream Hook
- xgo + Channel
- WaitGroup + xdefer
- 連接池
- 協程池
- 定時器
- 公共組件
- 中間件
- 驗證器
- 驗證器定義
- 驗證規則
- 靜態調用
- 模型
- 日志
- 緩存
- 數據庫
- Database
- QueryBuilder
- PDOConnection
- Persistent\PDOConnection
- Coroutine\PDOConnection
- MasterSlave\PDOConnection
- ExecuteListener
- Redis
- RedisConnection
- Persistent\RedisConnection
- Coroutine\RedisConnection
- ExecuteListener
- 常見問題
- 同一臺服務器部署多個服務
- 連接多個數據庫
- 如何設置跨域
- form-data 上傳文件失敗
- 開發工具
- 版本更新
- 不兼容改動
- 升級指南
- 文檔歷史