ThinkPHP6服務容器的高級用法

一、基礎綁定 & 接口綁定

// 普通綁定
app()->bind('cach.driver',\think\cache\driver\Redis::class);

// 接口綁定
app()->bind(\app\service\SmsInterface:class,\app\service\AliyunSms::class);
// 使用
$sms = app(\app\service\SmsInterface::calss);

二、單例(singleton)

保證容器內(nèi)只有一個實例(比如數(shù)據(jù)庫/Redis客戶端)

app()->singleton('redis',function(){
    $redis = new \Redis();
    $redis->connect('127.0.0.1');
    return $redis;
});

// 多次獲取,都是同一個對象
$redis1 = app('redis');
$redis2 = app('redis');
var_dump($redis1 === $redis2); // true

三、別名綁定

給服務起多個名字,方便調(diào)用

app()->bind('sms.aliyun', \app\service\AliyunSms::class);
app()->bind('sms.tencent', \app\service\TencentSms::class);

$sms1 = app('sms.aliyun');
$sms2 = app('sms.tencent');

四、延遲加載(Lazy Binding)

閉包綁定,只有第一次調(diào)用時才會創(chuàng)建實例。

app()->bind('big.service', function() {
    return new \app\service\BigService();
});

五、參數(shù)覆蓋 / 動態(tài)依賴注入

在 make時傳入?yún)?shù)覆蓋構(gòu)造方法。

$userService = app()->make(\app\service\UserService::class, [
    'uid' => 1001
]);

六、ServiceProvider(服務提供者)

把復雜注冊邏輯放在Provider類里

app/provider/SmsServiceProvider.php

<?php
namespace app\provider;

use think\Service;
use app\service\SmsInterface;
use app\service\AliyunSms;

class SmsServiceProvider extends Service
{
    public function register()
    {
        // 注冊服務
        $this->app->bind(SmsInterface::class, AliyunSms::class);
    }

    public function boot()
    {
        // 啟動時執(zhí)行邏輯,例如監(jiān)聽事件
        // Event::listen('sms.send', ...);
    }
}

config/app.php

'providers' => [
    app\provider\SmsServiceProvider::class,
],

七、事件驅(qū)動 + 容器結(jié)合

事件監(jiān)聽器可通過容器解析依賴

<?php
use think\facade\Event;

// 注冊監(jiān)聽
Event::listen('sms.send', function($data) {
    $logger = app('log');
    $logger->info("短信發(fā)送: " . json_encode($data));
});

// 觸發(fā)事件
event('sms.send', ['phone'=>'13800001111', 'msg'=>'驗證碼1234']);

八、自定義Facade(門面)

讓容器服務可以用靜態(tài)方法調(diào)用
app/facade/Sms.php

<?php
namespace app\facade;

use think\Facade;

class Sms extends Facade {
    protected static function getFacadeClass()
    {
        return \app\service\SmsInterface::class;
    }
}

使用

use app\facade\Sms;

Sms::send('13800001111', '驗證碼:1234');

總結(jié)

TP6容器的高級用法主要有以下幾種:

  • 綁定方式多樣:普通、接口、別名、閉包、單例
  • 靈活注入:動態(tài)傳參、延遲加載
  • 擴展機制:ServiceProvider管理復雜邏輯
  • 事件 & Facade:讓解耦更徹底,調(diào)用更優(yōu)雅
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容