日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

TP6的服務在自定義composer包中如何使用

作者:nece001 更新時間: 2023-07-07 編程語言

官方關于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

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新