Appearance
服务和钩子
服务的位置: modules/{module}/configurations/services.yaml
hook 位置: modules/{module}/configurations/hooks.yaml
服务和钩子的概念
我们来解释一下 service:
- service 是多个 module 之间扩展的重要方式。
- 我们将 service 和 hook 看作是插槽与插头的关系。一个插槽可以插多个插头。
- 每个模块下都会有一个 service.yaml 的文件,来描述本模块的可以提供的服务插槽。
使用
由于服务使用缓存机制, 所以在添加服务/钩子之后需要进行相应的缓存清理
$ php artisan poppy:optimize
Array 类型
定义 service
首先在 services.yaml 中定义如下内容
yaml
poppy.system.api_info:
title: 系统接口
type: array
description: 系统信息接口调用, 系统信息返回的灵活数据
poppy.system.api_info
分为三个部分
poppy : 命名空间
system : 模块
api_info : 自定义名称
定义 hooks
然后再 hooks.yaml 文件中,注册调用 hook 方法, Hooks 命名方式推荐
{模块名称}/Hooks/{定义模块}/{名称}
{Module}/Hooks/System/ApiInfo
yaml
- name: "poppy.system.api_info"
hooks:
- '\Poppy\System\Hooks\System\ApiInfo'
编写实现对应的 key()/data()方法
php
<?php
class ApiInfo
{
public function key()
{
return 'api';
}
public function data()
{
return 'info';
}
}
执行 ServiceFactory 的 parse 方法
php
sys_hook('poppy.system.api_info');
[
'api' => 'info'
]
Form
定义 service, 这个 Service 是单选 首先再 services.yaml 中定义如下内容
yaml
poppy.ad.place_selection:
title: 广告位选择
type: form
description: 选择广告位
注册 hook 方法
yaml
- name: "poppy.ad.place_selection"
builder: '\Poppy\Ad\Services\Hooks\AdPlaceSelection'
实现 builder 方法
php
public function builder($params = [])
{
$name = $params['name'];
$value = $params['value'] ?? null;
$options = $params['options'] ?? [];
$options += [
'class' => 'layui-input',
'placeholder' => '请选择广告位',
];
$places = AdPlace::pluck('title', 'id');
return \Form::select($name, $places, $value, $options);
}
调用执行
php
sys_hook('poppy.ad.place_selection', $param)