網站首頁 編程語言 正文
官方關于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()));
}
原文鏈接:https://blog.csdn.net/nece001/article/details/131471822
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2024-03-14 docker創建自定義網絡
- 2022-04-28 sql?server?累計求和實現代碼_MsSql
- 2022-05-20 Kafka 認證登錄注意事項
- 2022-06-01 C語言詳細分析常見字符串函數與模擬實現_C 語言
- 2022-05-21 Nginx實現會話保持的兩種方式_nginx
- 2022-04-15 Python3之字符串比較_重寫cmp函數方式_python
- 2022-09-09 pycharm?如何縮進和SQL亂碼及SQL包含變量_python
- 2022-05-18 ASP.NET?MVC自定義異常過濾器使用案例_實用技巧
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支