一、基礎綁定 & 接口綁定
// 普通綁定
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)雅