TP6的服务在自定义composer包中如何使用

2023-11-09

官方关于Service的说明文档:
https://www.kancloud.cn/manual/thinkphp6_0/1037490

做下概念说明:
Service和Provider在TP6中扮演着不同的角色。Service是用于封装特定功能的类,而Provider是用于注册和配置Service的类。

这里的Service指的是注册到容器中的一系列可以调用的类或方法(函数)。注册后的类或方法,可以直接从容器调用(即:依赖注入),例:

app(‘test’)->show();

看下是如何做到的,以下只对开发composer扩展包进行说明,写在项目目录中的可以参考官方的说明。

1.新建一个扩展包。
2.扩展包添加composer.json文件

{
    "name": "test/svs",
    "type": "library",
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "Test\\Svs\\": "src/"
        }
    },
    "extra": {
        "think": {
            "services": [
                "Test\\Svs\\SvsService" # 这里必须写正确(写不正确TP也不会报错,只会让你搞不清楚为什么不生效...]         
        }
    }
}

3.新建src目录,并添加具体的服务(即:Service)文件:Test.php
这个类将被注册到容器中:

<?php

namespace Test\Svs;

class Test
{

    private $foo;

    public function __construct(Foo $foo)
    {
        $this->foo = $foo;
    }

    public function show()
    {
        echo 'say test...';

        $this->foo->show();
    }
}

再建2个类用于测试依赖注入:

先来一个接口:

<?php

namespace Test\Svs;

interface IFoo
{
    public function show();
}

建两个类实现接口:

这个类只是实现了接口,但由于没有注册到容器,所以不能自动注入

<?php

namespace Test\Svs;

class Foo implements IFoo
{
    public function show()
    {
        echo 'say foo...';
    }
}

Bar.php,指定用来依赖注入的:

<?php

namespace Test\Svs;

class Bar implements IFoo
{
    public function show()
    {
        echo 'say bar...';
    }
}

4.新建服务注册(即:Provider)文件:SvsService.php
这个类是用来把Test注册到容器中,并可以执行启动相关操作。register()比boot()方法先执行。

<?php

namespace Test\Svs;

use think\Service;

/**
 * 定义服务类
 * 安装时将被添加到vendor/services.php中
 * 
 * @author gjw
 * @created 2023-06-29 09:35:28
 */
class SvsService extends Service
{
    /**
     * 注册
     *
     * @author gjw
     * @created 2023-06-29 09:36:22
     *
     * @return void
     */
    public function register()
    {
        echo 'SvsService::register()';
        // 注册一个类到容器
        // $this->app->bind('test', Test::class); // 实例类型是确定的可以不注册,系统能根据类型找到要注入哪个类
        $this->app->bind(IFoo::class, Bar::class); // 实例类型是不确定的,要明确指出要注入哪个类
        // 这里只做个绑定演示,个人感觉类型不确定的不要在这里进行绑定(相当于是写死了)
        // 可以在配置文件中设置绑定:app/provider.php(app/service.php虽然可以绑定,但不能指定类型--键名就是类型)
    }

    /**
     * 启动
     *
     * @author gjw
     * @created 2023-06-29 09:36:29
     *
     * @return void
     */
    public function boot()
    {
        echo 'SvsService::boot()';
        // 注册到容器的类已可以使用
        app('test')->show();
    }
}

SvsService这个类在composer.json中已配置过,所以运行composer安装或单独执行命令(php think service:discover)时,会被注册到vendor/services.php中。当程序运行时(包含command),这个文件会被加载,并运行注册和启动方法。
也就是说,composer方法注册的服务不需要添加到app/services.php即可使用。

接下来,项目任意位置都可以这样用了:
app(‘test’)->show();

或是在控制器方法上直接用作参数:

	public function index(SvsTest $t)
    {
        echo '<br>';
        $t->show();

        return view('index', array('time' => time()));
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TP6的服务在自定义composer包中如何使用 的相关文章

随机推荐

  • 实现Excel的导入、导出

    实现Excel的导入 导出 关于excel的操作在工作中经常会遇到 如果只是一次性使用的话 最简单的方式就是通过数据库的可视化工具 如Navicat 查询结果集之后直接一键生成excel了 当然这只能解燃眉之急 并不是长久之计 首先Exce
  • PAT C入门题目-7-12 日期格式化 (5 分)

    7 12 日期格式化 5 分 世界上不同国家有不同的写日期的习惯 比如美国人习惯写成 月 日 年 而中国人习惯写成 年 月 日 下面请你写个程序 自动把读入的美国格式的日期改写成中国习惯的日期 输入格式 输入在一行中按照 mm dd yyy
  • 小车+摄像头 +ros+gazebo+yolo仿真

    一 项目代码下载 https blog csdn net WhiffeYF article details 109187804 下载到 catkin ws2 src 中 这几个文件 其中 darknet ros 用于yolo的目标检测 mr
  • 【关于PyCharm安装和加载Pyecharts可视化库的方法和安装过程中出现的No Module Named XXX的解决方案】

    作者 亮马桥胡歌Wechat changxu1129 Echarts 是百度开源的一个数据可视化 JS 库 主要用于数据可视化 点击访问Echarts官网 http echarts baidu com index html 点此直接访问Py
  • Telink 825x 蓝牙开发笔记1

    Telink 825x 蓝牙开发笔记1 背景 美国贸易战导致芯片等模组价格上涨 为了以后长期发展需要研究国产蓝牙 Telink 一 环境搭建 1 软件下载 IDE Telink IDE 1 3 量产工具 Telink BDT exe v5
  • robots.txt 如何禁止蜘蛛(百度,360,搜狗,谷歌)搜索引擎获取页面内容

    什么是蜘蛛抓取 搜索引擎使用spider程序自动访问互联网上的网页并获取网页信息 spider在访问一个网站时 会首先会检查该网站的根域下是否有一个叫做robots txt的纯文本文件 您可以在您的网站中创建一个纯文本文件robots tx
  • 二十一. Kubernetes 配置的创建与使用

    目录 一 配置基础 二 Secret 配置介绍与使用示例 Secret 的创建 Secret 的使用 1 pod env 中作为环境变量获取使用 Secret 2 以卷挂载的方式使用 Secret 三 ConfigMap 介绍与使用示例 C
  • 卷积神经网络「失陷」,CoordConv来填坑

    卷积神经网络 失陷 CoordConv来填坑 作者 Rosanne Liu等 卷积神经网络拥有权重共享 局部连接和平移等变性等非常优秀的属性 使其在多种视觉任务上取得了极大成功 但在涉及坐标建模的任务上 如目标检测 图像生成等 其优势反而成
  • Qt实现基于多线程的文件传输(服务端,客户端)

    1 效果 先看看效果图 这是传输文件完成的界面 客户端 服务端 2 知识准备 其实文件传输和聊天室十分相似 只不过一个传输的是文字 一个传输的是文件 而这方面的知识 我已经在前面的博客写过了 不了解的同学可以去看一下 C 网络编程 Qt实现
  • excel文件服务器未响应,excel打不开文件未响应怎么处理-处理excel无法打开文件未响应的方法 - 河东软件园...

    Excel是office组件中的一个 经常跟数据打交道的用户每天都会接触到它 有的时候我们在打开该软件的时候都会出现无法导入文件的情况 无论你使用的是哪个版本的office软件都会在打开文件的时候发现软件没有响应 一般出现这样的情况都会在左
  • C++入门(一)----Visual C++ 6.0和Visual Studio 2019 的安装与使用

    Visual C 6 0的安装与使用 下载 安装 https blog csdn net weixin 41822392 article details 89519036 使用 https blog csdn net yiminghd286
  • 策略模式(Strategy)

    一 策略模式定义 定义一系列算法 把他们封装起来 并且他们可以相互替换 本模式使得算法可独立于使用他的客户而变化 二 策略模式结构说明 1 Strategy 策略接口 用来约束一系列具体的策略算法 Context使用这个接口来调用具体的策略
  • 开发人 学习资源

    非常优秀的资源 请珍惜 基础 游戏编程高级进阶书籍推荐 http www douban com doulist 522861 Amit游戏编程 http www cs students stanford edu amitp gameprog
  • Leetcode 刷题笔记(四) —— 数组类型解题方法四:模拟

    文章目录 系列文章目录 模拟 54 螺旋矩阵 59 螺旋矩阵 II 总结 系列文章目录 一 数组类型解题方法一 二分法 二 数组类型解题方法二 双指针法 三 数组类型解题方法三 滑动窗口 四 数组类型解题方法四 模拟 五 链表篇之链表的基础
  • pycharm中导入rospy包

    在pycharm中 问题描述 import rospy 显示有错误 在终端中import rospy 能通过 这种问题说明rospy已经安装成功 但是没有导入到pycharm中 解决办法 1 依次点击File gt settings gt
  • qt学习笔记11:QFile文件读写操作、QFileInfo文件信息提取

    QFile文件读写操作 需求 实现一个可以选择文件的对话框 在ui中 分别line edit push button 在widget中水平对齐 再整体和一个TextEdit对齐 界面上就得到一个大概的选取文件的窗口 点击选取文件窗口 左边会
  • PAT Basic 1008. 数组元素循环右移问题 (20)

    一个数组A中存有N N gt 0 个整数 在不允许使用另外数组的前提下 将每个整数循环向右移M M gt 0 个位置 即将A中的数据由 A0A1 AN 1 变换为 AN M AN 1 A0 A1 AN M 1 最后M个数循环移至最前面的M个
  • SLOT专业术语

    slot专业术语 要学习slot的知识首先要了解slot的一些专业术语 下面我们就列举一些slot的专业术语并给大家一一详细说明 现在大多数slot是三行五列的 我们就以三行五列 243lines的slot距离说明各种slot术语 上图出自
  • Wireshark网络抓包工具

    Wireshark工具 1 Wireshark软件简介 2 Wireshark下载 3 Wireshark安装 4 页面介绍 5 常用功能介绍 5 1 网络接口选择 5 2 抓包规则设定 5 3 查找目标数据包 5 4 快速选择过滤数据包
  • TP6的服务在自定义composer包中如何使用

    官方关于Service的说明文档 https www kancloud cn manual thinkphp6 0 1037490 做下概念说明 Service和Provider在TP6中扮演着不同的角色 Service是用于封装特定功能的