## 組件
組件是 MixPHP 的核心設計思想,整個框架都是由眾多核心組件構成。
| 類 |
| --- |
| Mix\Core\Component\AbstractComponent |
>[success] 用戶可通過自定義組件將頻繁調用的業務代碼常駐于內存,達到更高的性能。
組件的核心特征:
- 常駐內存
- 事件
- 協程隔離
>[danger] 請謹慎注冊太多組件,組件應該是全局使用的,使用頻繁的。
## 創建一個組件
你只需繼承 `Mix\Core\Component\AbstractComponent` 抽象類就可以了,由于組件類繼承自 `Mix\Core\Bean\AbstractObject` 所以組件都是通過依賴注入實例化的。
下面是一個組件范例:
~~~php
<?php
namespace Http\Components;
use Mix\Core\Component\AbstractComponent;
class MyComponent extends AbstractComponent
{
// 文字
public $text;
public function hello()
{
echo 'hello, ', $this->text;
}
}
~~~
## 組件注冊
所有組件都是在應用配置內的 `components` 字段內注冊,
下面是一個自定義組件的注冊配置:
~~~
// 組件配置
'components' => [
'myComponent' => [
// 依賴引用
'ref' => beanname(Http\Components\MyComponent::class),
],
],
// 依賴配置
'beans' => [
[
// 類路徑
'class' => Http\Components\MyComponent::class,
// 屬性
'properties' => [
// 文字
'text' => 'world',
],
],
],
~~~
- `myComponent` 為組件名稱,調用時使用。
- `ref` 為引用的依賴名稱,beanname 方法將類名轉換為依賴名稱。
## 如何調用組件
組件在框架內任何位置都可使用,包括:控制器、模型、自定義類、第三方類。
~~~php
app()->myComponent->hello();
~~~
## 為組件增加 IDE 代碼補全
找到 `applications/common/src/ApplicationInterface.php` ,在 PHP 注釋參數中增加:
```
@property \Http\Components\MyComponent $myComponent
```
>[info] MixPHP 框架幾乎全部代碼都有完善的 IDE 代碼補全支持,包括用戶自定義類,也提供了增加補全的方法。
## 組件的事件
由于組件是常駐內存的,請求結束后不會銷毀,而有些特殊情況下需要對請求周期內做一些初始化、數據清理方面的處理,所以 MixPHP 設計了事件機制,提供下面兩個請求級別的事件函數:
- onBeforeInitialize:服務器回調事件開始時觸發,用于請求開始的初始化處理。
- onAfterInitialize:服務器回調事件結束時觸發,用于請求結束的數據清理。
>[info] 已上事件代碼內沒有調用的組件不會觸發。
使用時只需在組件內重寫這幾個事件方法即可。
~~~php
// 前置初始化事件
public function onBeforeInitialize()
{
parent::onBeforeInitialize();
// ...
}
// 后置初始化事件
public function onAfterInitialize()
{
parent::onAfterInitialize();
// ...
}
~~~
## 組件的協程模式
框架實現了組件的協程隔離,用戶可在協程的任意位置使用組件,但用戶如果自己定義組件,需要了解組件的協程模式機制。
### 協程模式
[>> 到 GitHub 查看協程模式如何配置 <<](https://github.com/mix-php/mix-pool/blob/v2/src/AbstractConnectionPool.php#L17)
組件的協程模式決定組件在新的協程中獲取實例的方式:
- 新建模式 (默認):`ComponentInterface::COROUTINE_MODE_NEW`
當在啟動一個新的頂級協程時通過依賴配置新建一個組件類,執行 `onBeforeInitialize`,當該頂級協程內的最后一個子協程執行完成該組件類將被銷毀,執行 `onAfterInitialize`。
- 引用模式:`ComponentInterface::COROUTINE_MODE_REFERENCE`
在任意協程內都將獲取同一個全局實例,該類型的組件不執行 `onBeforeInitialize`、`onAfterInitialize` 事件。
## 第三方類庫設置為組件
>[danger] 由于 Swoole 為常駐程序,所有使用全局變量的庫,都有可能存在變量污染問題而無法設置為組件,特別是在協程模式。
通過使用 `Mix\Core\Component\ComponentTrait` 手動處理第三方的類的依賴注入,代碼如下:
~~~php
class MyComponent extends ThirdClass implements \Mix\Core\Component\ComponentInterface, ComponentInterface
{
use Mix\Core\Component\ComponentTrait;
// 如果需要接收配置,可以在這里手動處理,$config 就是傳入的配置信息
public function __construct($config = [])
{
parent::__construct();
}
}
~~~
然后將這個類注冊到組件配置 `components` 下即可。
- 歡迎使用 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 上傳文件失敗
- 開發工具
- 版本更新
- 不兼容改動
- 升級指南
- 文檔歷史