W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
服務(wù)容器有個非常強(qiáng)大特色,能夠綁定特定實例的接口。舉例,假設(shè)我們應(yīng)用程序要集成 Pusher 服務(wù)去收發(fā)即時事件,如果使用 Pusher 的 PHP SDK,可以在類注入一個 Pusher 客戶端實例:
<?php namespace App\Handlers\Commands;
use App\Commands\CreateOrder;
use Pusher\Client as PusherClient;
class CreateOrderHandler {
/**
* Pusher SDK 客戶端實例
*/
protected $pusher;
/**
* 創(chuàng)建一個實例
*
* @param PusherClient $pusher
* @return void
*/
public function __construct(PusherClient $pusher)
{
$this->pusher = $pusher;
}
/**
* 執(zhí)行命令
*
* @param CreateOrder $command
* @return void
*/
public function execute(CreateOrder $command)
{
//
}
}
在上面這個例子中,注入類的依賴到類中已經(jīng)能夠滿足需求;但同時,我們也緊密耦合于 Pusher 的 SDK 。如果 Pusher 的 SDK 方法發(fā)生改變,或者我們要切換到別的事件服務(wù),那我們也需要同時修改 CreateOrderHandler 的代碼。
為了將 CreateOrderHandler 和事件推送的修改「隔離」,我們可以定義一個 EventPusher 接口和一個 PusherEventPusher 實現(xiàn):
<?php namespace App\Contracts;
interface EventPusher {
/**
* Push a new event to all clients.
*
* @param string $event
* @param array $data
* @return void
*/
public function push($event, array $data);
}
一旦 PusherEventPusher 實現(xiàn)這接口,就可以在服務(wù)容器像這樣注冊它:
$this->app->bind('App\Contracts\EventPusher', 'App\Services\PusherEventPusher');
當(dāng)有類需要 EventPusher 接口時,會告訴容器應(yīng)該注入 PusherEventPusher,現(xiàn)在就可以在構(gòu)造器中「類型指定」一個 EventPusher 接口:
/**
* Create a new order handler instance.
*
* @param EventPusher $pusher
* @return void
*/
public function __construct(EventPusher $pusher)
{
$this->pusher = $pusher;
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: