<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                > 聲明:原書中本章叫做 IoC 容器,在 Laravel 5 中,IoC 容器改名為服務容器,所以,在后續章節,IoC 容器和服務容器指代同一個東西。 我們已經了解了依賴注入及其使用,接下來咱們一起來探索控制反轉容器(IoC)。我們前面已經說過,通過 IoC 容器可以幫助我們更方便地管理類依賴,而且 Laravel 提供了一個功能強大的 IoC 容器。這個 IoC 容器在 Laravel 中被稱作服務容器,是整個 Laravel 框架最核心的部分,在它的調度下,框架各個組件可以很好的組合在一起工作。實際上,Laravel 的`Application` 類就是一個繼承自 `Container` 的容器類,它就是整個 Laravel 應用的服務容器。 > IoC 容器:控制反轉容器讓依賴注入更方便,它負責在整個應用生命周期內解析和注入那些定義在容器中的類和接口。 > > 學院君注:在 Laravel 中經常提及的服務容器就是這里的 IoC 容器,你可以把服務容器看作 IoC 容器在 Laravel 框架中的方言別名,兩者等價。 在 Laravel 應用中,可以通過 `App` 門面來訪問服務容器,還可以通過輔助函數 `app()` 來訪問,如果是在服務提供者(可以理解為一個專門用于綁定接口與實現到服務容器的地方)中,則一般通過 `$this->app` 來訪問容器。服務容器提供了很多方法,不過我們會從最基礎的開始。下面我們繼續使用上一章創建的 `BillerInterface` 和`BillingNotifierInterface` 為例,并且假設在應用中使用 Stripe 進行支付操作。我們可以將支付接口的 Stripe 實現類綁定到容器里,這項工作可以在服務提供者的 `register()` 方法中完成(在本系列文檔中,不特別說明,我們使用的都是 `AppServiceProvider`),就像這樣: ```php public function register() { $this->app->bind(BillerInterface::class, function ($app) { return new StripeBiller($app->make(BillingNotifierInterface::class)); }); } ``` 注意在我們在初始化 `BillingInterface` 實現類時,額外需要一個`BillingNotifierInterface` 的實現,為此,我們需要編寫一個針對該接口的實現類 `EmailBillingNotifier`,具體實現先留空: ```php namespace App\Services; use App\Contracts\BillingNotifierInterface; class EmailBillingNotifier implements BillingNotifierInterface { public function notify(array $user, $amount) { // TODO: Implement notify() method. } } ``` 然后在服務提供者中將其綁定到所實現的接口: ```php $this->app->bind(BillingNotifierInterface::class, function ($app) { return new EmailBillingNotifier(); }); ``` > 注:注意到我們在定義綁定關系的時候使用的是匿名函數,這樣做的好處是用到該依賴時才會實例化,從而提升了應用的性能。 如你所見,這個服務容器就是個用來注冊各種接口與實現綁定的地方。一旦一個類在容器里注冊了以后,就可以很容易地在應用的任何位置解析并調用它。我們甚至還可以在一個綁定函數內解析其它的綁定關系,就像我們上面做的那樣。 一旦我們使用了服務容器,切換接口的實現就是一行代碼的事兒。舉個例子,考慮以下代碼: ```php class UserController extends BaseController{ public function __construct(BillerInterface $biller) { $this->biller = $biller; } } ``` 當這個控制器被服務容器實例化的時候,引用 `EmailBillingNotifier` 的 `StripeBiller` 會被注入到這個控制器中。現在,如果我們想要換一種通知的實現方式,比如通過短信發送通知(仿照 `EmailBillingNotifier` 新建一個 `SmsBillingNotifier` 類),只需在服務提供者中修改綁定到通知接口的實現類即可,其它任何地方都不用修改: ```php $this->app->bind(BillingNotifierInterface::class, function ($app) { return new SmsBillingNotifier(); }); ``` 這樣,不管在應用的哪個地方注入/解析賬單通知接口,都會得到 `SmsBillingNotifier` 類的實例。利用這種架構設計,我們的應用可以在各種服務的不同實現方式之間快速切換。 只改一行代碼就能切換接口實現,真的是很強大。例如,如果我們想把短信服務的提供商從原來的聯通替換為移動,可以開發一個新的基于移動接口實現的短信服務類,然后切換綁定語句。如果移動服務掛了,只需修改一行代碼就可以快速切換回原來的短信提供商,這正是服務容器的強大之處。 有時候,你可能想在整個應用生命周期中只實例化某類一次,類似單例模式,可以通過 `singleton` 方法來注冊接口與實現類: ```php $this->app->singleton(BillingNotifierInterface::class, function ($app) { return new SmsBillingNotifier(); }); ``` 現在,只要服務容器解析過這個賬單通知對象實例一次,在剩余的請求生命周期中都會使用同一個實例。 服務容器還提供了和 `singleton` 方法很類似的 `instance` 方法,區別是 `instance` 方法可以綁定一個已經存在的對象實例。然后容器每次解析的時候都會返回這個對象實例。 ```php $notifier = new SmsBillingNotifier; $this->app->instance(BillingNotifierInterface::class, $notifier); ``` 現在我們已經熟悉了服務容器的基本使用,接下來,讓我們深入挖掘它更加強大的功能:依靠反射來動態解析類。 > 單獨使用容器:即使你的項目不是基于 Laravel 框架的,依然可以使用Laravel 的服務容器,只要通過 Composer 安裝 `illuminate/container` 就好了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看