# 定制服务
框架中所有功能都以服务的形式扁平化设计,当然也支持开发者自行扩展服务用于自身业务扩展。
[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
- 启动与关闭
- 前端
- 微信