# 定制服務
框架中所有功能都以服務的形式扁平化設計,當然也支持開發者自行擴展服務用于自身業務擴展。
[TOC]
## 目錄結構
* system/config/service.php 服務聲明配置
* system/service 服務文件存放位置
## 創建服務
### 命令創建
使用命令行可以快速創建服務
```
php hd make:service HdForm
```
> 如果定義的服務與系統服務重名時,將優先使用系統服務用戶定義的服務將失效。
為了防止自定義服務與系統服務重名,建議命名上使用前綴修飾如上例中的Form服務建議使用 HdFormProvider 這樣的約束。
執行以上命令后會創建出HdForm服務,共創建三個文件,文件說明如下:
1. HdForm.php 服務功能類,實現功能實體代碼
2. HdFormProvider.php 服務提供者,用于注入到框架服務容器中,方便在從容器中提取服務使用
3. HdFacade.php 外觀提供者,用于簡便調用服務使用
### 設置配置
創建完文件后服務并不可以使用需要添加相應配置,配置文件為 config/service.php ,針對上面創建的服務設置配置項如下:
```
<?php
return [
//服務提供者
'providers' => [
'system\service\HdForm\HdFormProvider',
],
//服務外觀
'facades' => [
'HdForm' => 'system\service\HdForm\HdFormFacade',
]
];
```
## 服務功能類
上例中創建的文件HdForm.php 為服務功能類,實現功能實體代碼,代碼如下:
```
<?php namespace system\service\HdForm;
class HdForm {
//構造函數
public function __construct() {
}
public function select() {
echo '恭喜你,服務創建成功! 這是服務方法執行的結果';
}
}
```
## 服務提供者
上例中創建的文件HdForm.php 為服務提供者。
服務提供者用于注入到框架服務容器IOC中,這樣我們就可以在控制器、中間件、路由器等任何位置使用服務了。代碼如下:
```
<?php namespace system\service\HdForm;
use houdunwang\framework\build\Provider;
class HdFormProvider extends Provider {
//延遲加載
public $defer = true;
//服務運行時自動執行的方法
public function boot() {
}
public function register() {
$this->app->single( 'HdForm', function ( $app ) {
return new HdForm($app);
} );
}
}
```
設置好服務和配置項后我們就可以使用以下方法使用服務了。
```
<?php namespace admin\controller;
class Index{
public function index(){
//App::make() 用于從IOC容器中載入服務
App::make('HdForm')->select();
}
}
```
## 外觀處理類
上例中創建的文件 HdFacade.php 外觀提供者,外觀類并不是必須的,外觀類的作用就是調用服務簡便了而已。
用于簡便調用服務使用,使用外觀調用需要設置配置項才有效。
在上例中我們創建好服務并設置了配置項后,就可以使用 HdForm::test() 的形式調用服務功能類中的方法了。代碼如下:
```
<?php namespace system\service\HdForm;
use houdunwang\framework\build\Facade;
class HdFormFacade extends Facade{
public static function getFacadeAccessor(){
return 'HdForm';
}
}
```
當創建了外觀后,我們就可以不使用 App::make()實例化服務了,直接使用服務類調用了。
```
<?php namespace admin\controller;
class Index{
public function index(){
//使用App服務實例出Form服務,然后執行服務中的select方法
HdForm::select();
}
}
```
## 注冊方式
將服務注冊到容器要在服務提供者Provider中完成,有以下幾種注冊方式。
#### 使用閉包注冊
上例中我們就是使用閉包進行的注冊
```
public function register() {
$this->app->single( 'HdForm', function ( $app ) {
return new HdForm($app);
} );
}
```
#### 使用類名注冊
```
public function register() {
$this->app->single( 'HdForm', 'system\service\HdForm\HdForm' );
}
```
## 注冊類型
服務最終會返回對象實例,根據情況不同我們可能需要“單例”返回或“多例”返回。框架為不同情況提供了不同的注冊指令。
#### bind注冊方法
bind由三個參數構成,第三個參數為true時為單例模式,即只生成一個服務實例對象。為false(默認)時每次調用服務都新生成一個服務對象。
```
public function register() {
$this->app->bind( 'HdForm', function ( $app ) {
return new HdForm($app);
},true);
}
```
#### single注冊方法
使用single方法可注冊單例服務,請求中使用了多次服務只生成一個實例對象。
```
public function register() {
$this->app->single( 'HdForm', function ( $app ) {
return new HdForm($app);
} );
}
```
### instance注冊方法
使用 instance 方法注冊服務也是返回單例,只是第二個參數只能為對象。
```
public function register() {
$this->app->instance( 'HdForm', new HdForm() );
}
```
- 文檔已經遷移到后盾人
- 介紹
- 框架特性
- 開發規范
- 許可協議
- 作者向軍
- 安裝框架
- 更新框架
- 基礎
- 入口文件
- 應用配置
- 優雅鏈接
- 目錄結構
- 系統常量
- 自動加載
- 應用密鑰
- 系統函數
- CSRF保護
- 依賴注入
- 跨域訪問
- 配置
- 配置文件
- 基本功能
- 擴展配置
- c 函數
- 控制器
- 定義聲明
- 基本使用
- 相關函數
- 響應消息
- 路由
- 基礎知識
- 基礎路由
- 路由參數
- 參數檢測
- 依賴注入
- 控制器
- 分組路由
- RESTful
- 別名路由
- 數據
- 配置相關
- 核心操作
- 查詢構造器
- 日志記錄
- 分頁處理
- 事務處理
- 函數相關
- 數據庫
- 數據遷移
- 數據填充
- 模型
- 定義模型
- 模型動作
- 模型驗證
- 自動完成
- 自動過濾
- 字段保護
- 數據填充
- 多表關聯
- 分頁處理
- 倉庫
- 數據倉庫
- 查詢規則
- 視圖
- 基礎知識
- 模板配置
- 模板文件
- 分配數據
- 系統標簽
- 擴展標簽
- 緩存模板
- 模板繼承
- 視圖函數
- widget
- vue組件
- 中間件
- 中間件
- 緩存
- 基本操作
- 文件緩存
- 數據表緩存
- 服務
- 服務容器
- 定制服務
- 相關函數
- 請求
- 基本使用
- 請求擴展
- 測試
- 基礎知識
- 基本使用
- HTTP測試
- 調試
- 調試模式
- 日志管理
- 組件
- 多語言
- 響應處理
- Cookie
- Session
- 驗證碼
- XML
- 自動驗證
- 文件處理
- 壓縮解壓
- RBAC
- 數組增強
- 分頁管理
- 圖像處理
- 生成靜態
- 加密解密
- 字符串
- 數據集合
- 工具服務
- 目錄操作
- 郵件發送
- CURL
- QQ登錄
- 數據備份
- 購物車
- 日志處理
- 命令組件
- 二維碼
- 后盾云
- 日期處理
- 阿里
- 支付寶
- 阿里云直播
- 阿里云短信
- 阿里云郵件
- 阿里云OSS
- SOCKET
- 啟動與關閉
- 前端
- 微信