## 組件
組件是 MixPHP 的核心設計思想,整個框架都是由眾多核心組件構成。
| 類 |
| --- |
| mix\base\Component |
>[success] 通過用戶可自定義組件、組件常駐內存這兩個特性 MixPHP 能讓用戶將頻繁調用的業務代碼也可常駐于內存,達到更高的性能。
組件的核心特征:
- 常駐內存
- 事件
- 協程隔離
>[danger] 請謹慎注冊太多組件,組件應該是全局使用的,使用頻繁的。
## 創建一個組件
你只需繼承 `\mix\base\Component` 類,就可以了,下面是一個范例:
~~~php
<?php
namespace apps\index\components;
use \mix\base\Component;
class MyComponent extends Component
{
public $name;
public function hello()
{
echo 'hello, ', $this->name;
}
}
~~~
## 組件注冊
所有組件都是在應用配置內的 `components` 字段內注冊,下面是一個自定義組件的注冊配置:
~~~php
// 組件配置
'components' => [
// 普通命名
'myComponent' => [
// 類路徑
'class' => 'apps\index\components\MyComponent',
// 屬性
'name' => '小花',
],
// 帶前綴的名稱
'prefix.myComponent' => [
// 類路徑
'class' => 'apps\index\components\MyComponent',
// 屬性
'name' => '小花',
],
// 帶多級前綴的名稱
'prefix.prefix.myComponent' => [
// 類路徑
'class' => 'apps\index\components\MyComponent',
// 屬性
'name' => '小花',
],
],
~~~
- myComponent 是組件名稱,調用時使用。
- class 需要實例化類的命名空間。
- 其他字段:都會在該類實例化后,導入為對象屬性,key為屬性名稱,value為屬性的值。
[>> 到 GitHub 查看默認組件配置 <<](https://github.com/mix-php/mix/blob/v1/apps/httpd/config/http_permanent.php#L18)
## 如何調用組件
在框架內任何位置都可使用,包括:控制器、模型、自定義類、第三方類。
~~~php
// 普通命名
app()->myComponent->hello();
// 帶前綴的名稱
app('prefix')->myComponent->hello();
// 帶多級前綴的名稱
app('prefix.prefix')->myComponent->hello();
~~~
MixPHP 支持兩種運行模式,不同模式下組件初始化的方式不同:
- mix-httpd:全部組件在服務器啟動時已經加載完成。
- Apache/PHP-FPM:懶加載,只有調用 `app()->[ComponentName]` 時組件才會加載。
## 組件的事件
由于組件是常駐內存的,請求結束后不會銷毀,而有些特殊情況下需要對請求周期內做一些初始化、數據清理方面的處理,所以 MixPHP 設計了事件機制,提供下面兩個請求級別的事件函數:
- onRequestBefore:每次請求開始時觸發,用于請求級別的初始化處理(代碼內沒有調用的組件不會觸發)。
- onRequestAfter:每次請求結束時觸發,用于請求結束后組件數據清理(代碼內沒有調用的組件不會觸發)。
使用時只需在組件內重寫這幾個事件方法即可。
~~~php
// 請求前置事件
public function onRequestBefore()
{
parent::onRequestBefore();
// ...
}
// 請求后置事件
public function onRequestAfter()
{
parent::onRequestAfter();
// ...
}
~~~
由于 `\mix\base\Component` 類繼承了 `mix\base\BaseObject` 類,所以還包含三個事件:
- onConstruct:構造事件,相當于 __construct 方法。
- onInitialize:當組件完成構造事件并導入配置信息為屬性后觸發該事件,用于做一些初始化處理。
- onDestruct:析構事件,相當于 __destruct 方法。
使用時只需在組件內重寫這幾個事件方法即可。
~~~php
// 構造事件
public function onConstruct()
{
parent::onConstruct();
// ...
}
// 初始化事件
public function onInitialize()
{
parent::onInitialize();
// ...
}
// 析構事件
public function onDestruct()
{
parent::onDestruct();
// ...
}
~~~
## 直接將第三方類庫設置為組件 `Trait`
>[danger] 由于 Swoole 為常駐程序,所有使用全局變量的庫,都有可能存在變量污染問題而無法設置為組件,特別是在協程模式。
用戶只需新增一個類,繼承第三方類庫,實現 `mix\base\ComponentInterface`,`mix\base\StaticInstanceInterface` 接口,并引用 `mix\base\StaticInstanceTrait`、`mix\base\ComponentTrait` 即可。
代碼如下:
~~~php
class MyComponent extends ThirdClass implements StaticInstanceInterface, ComponentInterface
{
use StaticInstanceTrait, ComponentTrait;
// 如果需要接收配置,可以在這里手動處理,$config 就是傳入的配置信息
public function __construct($config = [])
{
parent::__construct();
}
}
~~~
然后將這個類注冊到組件配置 `components` 下即可。
- 歡迎使用 MixPHP
- 安裝說明
- 常規安裝
- 只安裝命令行
- Apache/PHP-FPM安裝
- 開發與調試
- 開發注意事項
- 調試與錯誤
- 基礎架構
- 目錄結構
- 目錄設計
- URL訪問
- 命名空間
- 自動加載
- 入口文件
- 框架核心
- Application
- 配置
- 對象
- 組件
- 門面
- 系統服務
- 中間件
- 驗證器
- 驗證器定義
- 驗證規則
- 靜態調用
- 模型
- 日志
- 命令行
- 簡介
- 命令行開發常識
- 創建命令
- 執行與選項
- 控制臺程序
- 守護程序
- HTTP 服務
- 簡介
- 服務器
- 路由
- 請求
- 響應
- 控制器
- 視圖
- Token
- Session
- Cookie
- 文件上傳
- 圖片處理
- 分頁
- 驗證碼
- WebSocket 服務
- 簡介
- 回調函數
- 消息處理器
- 客戶端測試
- nginx代理
- 60s無消息斷線
- 多進程
- ProcessPoolTaskExecutor
- 流水線模式
- 推送模式
- 在 Supervisor 中使用
- 協程
- 簡介
- 如何開啟協程
- HTTP 協程開發
- 命令行協程開發
- 客戶端
- MySQL
- PDO
- PDOPersistent
- PDOMasterSlave
- PDOCoroutine
- Redis
- Redis
- RedisPersistent
- RedisCoroutine
- 外部工具庫
- 簡介
- think-orm
- psr-log
- 安全建議
- 常見問題
- 啟動多個 HTTP 服務器
- 連接多個數據庫
- 如何設置跨域
- mix-httpd service stop 無效
- No such file or directory
- 錯誤級別配置不生效
- 推進計劃
- 文檔歷史