# 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 的前處理  Why 要有 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`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up