## 門面 (Facade)
MixPHP 的門面具有如下功能:
- 為 **組件** 提供了一個靜態調用接口,帶來了更好的可讀性與快速性,
- 同類型組件多源切換,如:多個 PDO、Redis 連接切換。
你可以為任何組件定義一個 `facade` 類。
## 核心門面類庫
系統給內置的常用類庫定義了 Facade 類庫,可直接使用,包括:
| 組件 | 門面類 |
| --- | --- |
| app()->request | mix\facades\Request |
| app()->response | mix\facades\Response |
| app()->input | mix\facades\Input |
| app()->output | mix\facades\Output |
| app()->log | mix\facades\Log |
| app()->error | mix\facades\Error |
| app()->token | mix\facades\Token |
| app()->session | mix\facades\Session |
| app()->cookie | mix\facades\Cookie |
| app()->pdo | mix\facades\PDO |
| app()->redis | mix\facades\Redis |
## 自定義門面
為下面的組件定義一個門面:
~~~
// 組件配置
'components' => [
// 普通命名
'myComponent' => [
// 類路徑
'class' => 'apps\index\components\MyComponent',
// 屬性
'name' => '小花',
],
],
~~~
然后在 `apps\httpd\facades` 目錄新增一個 `myComponent` 類文件。
~~~
<?php
namespace apps\httpd\facades;
use mix\base\Facade;
class myComponent extends Facade
{
// 獲取實例
public static function getInstance()
{
return app()->myComponent;
}
}
~~~
## 門面使用
原本組件的調用:
~~~
app()->myComponent->foo();
~~~
門面類的調用,是不是簡單很多。
~~~
myComponent::foo();
~~~
## 代碼補全
自己創建的門面類是沒有代碼補全的,需要用戶自己在注釋中添加。
例如:
~~~
* @method emergency($message, array $context = []) static
* @method alert($message, array $context = []) static
* @method critical($message, array $context = []) static
* @method error($message, array $context = []) static
~~~
[>> 到 GitHub 查看門面注釋 DEMO <<](https://github.com/mixstart/mixphp-framework/blob/v1/src/facades/Log.php)
## 同類型組件多源切換
系統提供的如下 Facade 類庫具有多源切換功能:
| 門面類 |
| --- |
| mix\facades\PDO |
| mix\facades\Redis |
我們先看一下源碼,看看于普通的有何不同:
[>> 到 GitHub 查看多源切換門面 <<](https://github.com/mixstart/mixphp-framework/blob/v1/src/facades/PDO.php)
- `getInstances` 方法返回一個具有多個組件的數組。
- `name` 方法可以通過名稱切換當前使用的組件,這樣就達到了切換數據庫的效果。
當然我們實際使用中一定不可能去修改這個核心門面,只需寫一個新的門面繼承 `mix\facades\PDO` 類,并重寫 `getInstances` 方法即可。
框架默認代碼已經幫你繼承好了,如下:
[>> 到 GitHub 查看門面 DEMO <<](https://github.com/mix-php/mix/blob/v1/apps/common/facades/PDO.php)
當需要頻繁使用多個連接時,只需增加一個 pdo 組件:
~~~
// 數據庫
'pdo' => [
// 類路徑
'class' => 'mix\client\PDO',
// 數據源格式
'dsn' => env('DB_DSN'),
// 數據庫用戶名
'username' => env('DB_USERNAME'),
// 數據庫密碼
'password' => env('DB_PASSWORD'),
// 設置PDO屬性: http://php.net/manual/zh/pdo.setattribute.php
'attribute' => [
// 設置默認的提取模式: \PDO::FETCH_OBJ | \PDO::FETCH_ASSOC
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
],
],
// 數據庫
'db1.pdo' => [
// 類路徑
'class' => 'mix\client\PDO',
// 數據源格式
'dsn' => env('DB_DSN'),
// 數據庫用戶名
'username' => env('DB_USERNAME'),
// 數據庫密碼
'password' => env('DB_PASSWORD'),
// 設置PDO屬性: http://php.net/manual/zh/pdo.setattribute.php
'attribute' => [
// 設置默認的提取模式: \PDO::FETCH_OBJ | \PDO::FETCH_ASSOC
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
],
],
~~~
然后修改 `apps/common/facades/PDO` 類代碼如下:
~~~
/**
* 獲取實例集合
* @return array
*/
public static function getInstances()
{
return [
'default' => app()->pdo,
'db1' => app('db1')->pdo,
];
}
~~~
使用:
~~~
// 使用 default
/apps/common/facades/PDO::createCommand($sql)->queryAll();
// 使用 db1
/apps/common/facades/PDO::name('db1')->createCommand($sql)->queryAll();
~~~
- 歡迎使用 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
- 錯誤級別配置不生效
- 推進計劃
- 文檔歷史