# 定制服务 框架中所有功能都以服务的形式扁平化设计,当然也支持开发者自行扩展服务用于自身业务扩展。 [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() ); } ```