將接口綁定到實現(xiàn)

2018-02-24 15:51 更新

注入具體依賴

服務(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;
    }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號