服务
未知
2021-07-04 10:16:23
0

系统服务

系统服务的概念是指在执行框架的某些组件或者功能的时候需要依赖的一些基础服务,服务类通常可以继承系统的think\Service类,但并不强制(如果继承think\Service的话可以直接调用this->app获取应用实例)。

你可以在系统服务中注册一个对象到容器,或者对某些对象进行相关的依赖注入。由于系统服务的执行优先级问题,可以确保相关组件在执行的时候已经完成相关依赖注入。

服务定义

你可以通过命令行生成一个服务类,例如:

php think make:service  FileSystemService
复制

默认生成的服务类会继承系统的think\Service,并且自动生成了系统服务类最常用的两个空方法:registerboot方法。

注册方法

register方法通常用于注册系统服务,也就是将服务绑定到容器中,例如:

<?php
namespace app\service;

use my\util\FileSystem;

class FileSystemService extends Service
{
    public function register()
    {
        $this->app->bind('file_system', FileSystem::class);
    }
}
复制

register方法不需要任何的参数,如果你只是简单的绑定容器对象的话,可以直接使用bind属性。

<?php
namespace app\service;

use my\util\FileSystem;

class FileSystemService extends Service
{
    public $bind = [
        'file_system'    =>    FileSystem::class,
    ];
}
复制

启动方法

boot方法是在所有的系统服务注册完成之后调用,用于定义启动某个系统服务之前需要做的操作。例如:

<?php
namespace think\captcha;

use think\Route;
use think\Service;
use think\Validate;

class CaptchaService extends Service
{
    public function boot(Route $route)
    {
        $route->get('captcha/[:config]', "\\think\\captcha\\CaptchaController@index");

        Validate::maker(function ($validate) {
            $validate->extend('captcha', function ($value) {
                return captcha_check($value);
            }, ':attribute错误!');
        });
    }
}
复制

boot方法支持依赖注入,你可以直接使用其它的依赖服务。

服务注册

定义好系统服务后,你还需要注册服务到你的应用实例中。

可以在应用的全局公共文件service.php中定义需要注册的系统服务,系统会自动完成注册以及启动。例如:

return [
    '\app\service\ConfigService',
    '\app\service\CacheService',
];
复制

如果你需要在你的扩展中注册系统服务,首先在扩展中增加一个服务类,然后在扩展的composer.json文件中增加如下定义:

"extra": {
    "think": {
        "services": [
            "think\\captcha\\CaptchaService"
        ]
    }
},
复制

在安装扩展后会系统会自动执行service:discover指令用于生成服务列表,并在系统初始化过程中自动注册。

内置服务

为了更好的完成核心组件的单元测试,框架内置了一些系统服务类,主要都是用于核心类的依赖注入,包括ModelServicePaginatorServiceValidateService类。这些服务不需要注册,并且也不能卸载。

上一篇:容器和依赖注入

下一篇:6门面

相关内容

MySQL变量的生命周期管...
MySQL变量管理关键在于生命周期控制。需了解全局、会话及用户自定...
2024-11-20 20:46:37
MySQL变量的作用域与访...
摘要: MySQL变量具有作用域和访问控制,局部变量限于特定上下...
2024-11-20 20:00:40
MySQL变量定义与初始化
MySQL变量分为系统变量和用户定义变量,用于存储数据和配置参数。...
2024-11-20 19:00:42
如何使用MySQL变量进行...
本文详细介绍了MySQL中用户定义变量、系统变量和局部变量的使用方...
2024-11-20 18:46:45
动态分配MySQL变量的示...
MySQL中,变量用于存储临时数据,包括全局和会话变量以及用户定义...
2024-11-20 18:23:38
MySQL变量存储的数据类...
MySQL支持多种数据类型以存储不同种类的变量,包括数值型、字符串...
2024-11-20 18:00:48

热门资讯

tp6开发规范 命名规范 请理解并尽量遵循以下命名规范,可以减少在开发过程中出现不必要的错误。 ThinkPHP6....
6高级查询 快捷查询 快捷查询方式是 一种多字段相同查询条件 的简化写法,可以进一步简化查询条件的写法,在多个字...
tp6多应用提示控制器不存在:... 第一个情况是没有使用composer安装扩展。 如果要使用多应用模式, 你需要win+r,cmd指针...
6配置 配置目录 单应用模式 对于单应用模式来说,配置文件和目录很简单,根目录下的 config 目录下面就...
6异常处理 和PHP默认的异常处理不同,ThinkPHP抛出的不是单纯的错误信息,而是一个人性化的错误页面。 异...
6swoole 本篇内容主要讲述了最新的 think-swoole 扩展的使用。目前仅支持Linux环境或者MacO...
6助手函数 助手函数 系统为一些常用的操作方法封装了助手函数,便于使用,包含如下: 助手函数 描述 abort ...
6查询表达式 查询表达式 查询表达式支持大部分的SQL查询语法,也是 ThinkPHP 查询语言的精髓,查询表达式...
6路由参数 路由参数 路由分组及规则定义支持指定路由参数,这些参数主要完成路由匹配检测以及后续行为。 路由参数可...
6查询 模型查询和数据库查询方法的区别主要在于,模型中的查询的数据在获取的时候会经过获取器的处理,以及更加对...