---
# System prepended metadata

title: laravel Service Provider
tags: [Laravel]

---

# laravel Service Provider 



https://www.youtube.com/watch?v=VYPfncvYW-Y


要看
https://laracasts.com/series/laravel-from-scratch-2018/episodes/22
要看
https://hackmd.io/@javck/ByJgF8HRP/%2FrowEbmWqSbqoyie4D5rOlA
## Appservice能做的事情 
blade註冊
使用bootrap再分頁
json不加data不包裝
...很多

## 主要介紹

有點像config配置檔案,但他更面向對象


**我们知道， Container 有很多种 「绑定」 的姿势，比如 bind() , extend() , singleton() , instance() 等等，那么 Laravel 中怎样「注册」这些「绑定」呢？那就是 Service Provider**

**Service Providers (服务提供者) 是 Laravel 「引导」过程的核心。这个「引导」过程可以理解成「电脑从按下开机按钮到完全进入桌面」这段时间系统干的事。**


Laravel 在「引导」过程中干了两件重要的事：

通过 Service Provider 的 register() 方法注册「绑定」
所有 Servier Provider 的 register() 都执行完之后，再通过它们 boot() 方法，干一些别的事。

核心概念：註冊與管理 Container 內服務的地方。會根據模組來產生不同的 Provider。
Provider 有兩個步驟：register & boot
**register**
用來寫 bind，負責綁定service到container
只需要將事物綁定到服務容器。而不要嘗試在register方法中註冊任何監聽器

可以綁定街口
可以將綁定街口註冊別名
但這別名只是解析的別名
你還是要去config\app.php註冊全域的別名

**boot**
register 結束後執行的方法。使用這個 service 的前處理
![](https://i.imgur.com/wSVDoeo.png)


Ｗhy 要有 Provider?
若都在同一支 bootstrap/app.php 註冊，多人開發時，會一直有 merge conflict

實際執行 service proivder 的方法在 ProviderRepository 中。主要流程如下：

讀取 boostrap/cache/services.php。
判斷是否重新產生 cache 檔。
從 cache 檔中判斷每個 servcie provider 是那一類型，然後分別執行。
基本上 cache 檔中 service provider 被分為三種類別，它們的特點如下 :
when : 當某個事件被執行的時後，才會執行 service provider。
eager : 直接執行 service provider。
deferred : 等到要執行 make 前，才會執行 service provider。

## ServiceProvider中繫結介面
ServiceProvider是Laravel IOC容器實現動態換介面實現的地方，所以我們在這裡繫結一下，這樣我們在使用的時候，不直接使用介面實現，而是用ioc容器解析介面，它會幫你自動找到對應好的實現。這就意味著，以後需要更換實現，可以在這裡更換


##  register
所有的服務提供者都應繼承 Illuminate\Support\ServiceProvider 此一類別。在這個抽象類別中，至少必須定義一個方法： register 。在 register 方法中，應該只綁定服務到服務容器之中。你永遠不該試圖在 register 方法中註冊任何事件監聽器、路由或任何其他功能。

## 啟動方法
所以，若我們需要在服務提供者中註冊一個事件監聽器，該怎麼做？它應該在 boot 方法中完成。這個方法會在所有的服務提供者註冊後才被呼叫，這讓你能取用框架中所有其他已註冊過的服務。

```
<?php namespace App\Providers;

use Event;
use Illuminate\Support\ServiceProvider;

class EventServiceProvider extends ServiceProvider {

    /**
     * 執行註冊後的啟動服務。
     *
     * @return void
     */
    public function boot()
    {
        Event::listen('SomeEvent', 'SomeEventHandler');
    }

    /**
     * 在容器中註冊綁定。
     *
     * @return void
     */
    public function register()
    {
        //
    }

}
```

我們可以對 boot 方法中的相依作型別暗示。服務容器會自動注入任何你所需要的相依：

```
use Illuminate\Contracts\Events\Dispatcher;

public function boot(Dispatcher $events)
{
    $events->listen('SomeEvent', 'SomeEventHandler');
}
```

###### tags: `Laravel`