Laravel文檔的`Service Container`、`Service Providers`兩節內容有幾個概念搞不太明白

來源:互聯網
上載者:User
關鍵字 laravel php
Laravel文檔的 Service ContainerService Providers兩節內容有幾個概念搞不太明白:
https://laravel.com/docs/5.2/providers
https://laravel.com/docs/5.2/container

1、什麼是bootstrapping?
好像靠反射機制來實現,對反射機制的概念也搞不太明白,反射機制是什麼反射給什麼,反射了個什麼東西?

2、boot()方法:
它的作用是什麼呢?

3、register()方法:
把什麼註冊到什嗎?是把Service註冊到Service Container嗎?那麼這兩個東西在哪裡呢?假如我自己寫一個Service,一般放在什麼目錄?Service Container是一個可以看得見的檔案嗎,存放在什麼目錄呢?

4、bind()方法:
把什麼綁定到什嗎?和前面一樣,綁定的雙方是什麼。

麻煩大神幫解釋一下。非常感謝!

回複內容:

Laravel文檔的Service ContainerService Providers兩節內容有幾個概念搞不太明白:
https://laravel.com/docs/5.2/providers
https://laravel.com/docs/5.2/container

1、什麼是bootstrapping?
好像靠反射機制來實現,對反射機制的概念也搞不太明白,反射機制是什麼反射給什麼,反射了個什麼東西?

2、boot()方法:
它的作用是什麼呢?

3、register()方法:
把什麼註冊到什嗎?是把Service註冊到Service Container嗎?那麼這兩個東西在哪裡呢?假如我自己寫一個Service,一般放在什麼目錄?Service Container是一個可以看得見的檔案嗎,存放在什麼目錄呢?

4、bind()方法:
把什麼綁定到什嗎?和前面一樣,綁定的雙方是什麼。

麻煩大神幫解釋一下。非常感謝!

  1. bootstrapping是指Service Provider的註冊啟動過程。簡單說,就是一個Service Provider怎麼註冊進Service Container,註冊事件監聽等。

  2. boot方法的作用是當Service Provider註冊進Service Container並被Service Container啟動後執行的啟動代碼,做一些初始化的操作。

  3. register()方法就是具體的通過調用Container的bind()方法實現把Service綁定到Service Container的屬性上。

  4. bind()方法是在Service Container的方法,Service Provider通過這個方法(以及其他類似方法)來執行綁定。

在Laravel中,一個app就是一個最常見的Service Container,它本質上是一個對象,通過它的bind方法,我們可以為他增加一個屬性,這個屬性就是Service Provider。但是這個屬性的名字等資訊怎麼來呢,由Service Providerregister決定,register方法裡面其實就是確定了provider所綁定在的屬性名稱字。這樣一個Service Provider就註冊進了container,當我們需要這個provider執行功能的時候,通過屬性名稱字找到provider,然後啟動它,一旦啟動,provider先運行它的boot方法進行初始化,之後開始實現業務,完成整個過程。

下面結合Laravel的Filesystem的程式碼分析一下以上過程:

registerNativeFilesystem();        $this->registerFlysystem();    }    /**     * Register the native filesystem implementation.     *     * @return void     */    protected function registerNativeFilesystem()    {        /*         * 這裡就是具體的註冊代碼         * $this->app就是一個ServiceContainer         * new Filesystem就是執行個體化一個Service,所以Service就是新產生的FileSystem對象,         * 也就是在相同目錄裡的Filesystem.php檔案裡定義的類的對象         * files就是要把這個service對象邦定到serviceContainer裡的名字         * singleton是類似bind的方法,只不過邦定的是一個單例         * 經過邦定之後,就可以通過app->files來使用這個Service         * 所以本身這個類才叫ServiceProvider,就是只負責提供邦定一個特定service到一個特定的container的功能        */        $this->app->singleton('files', function () {            return new Filesystem;        });    }}

laravel初學者。

關於Service Provider,找到一個解釋,這個解釋應該沒有什麼問題。

register方法用於綁定服務到容器,架構會先調用所有provider的register方法,等所有服務都註冊完畢再去調用每一個服務的boot方法。
所以不能在register方法裡面調用其他provider提供的服務,因為我們無法保證其他服務已經註冊完畢。
而在boot方法裡面你可以幹任何事情!

再說Service Container,看vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php內部實現:

public function register(){    $this->registerAuthenticator();    $this->registerUserResolver();    $this->registerAccessGate();    $this->registerRequestRebindHandler();}protected function registerUserResolver(){    $this->app->bind(        AuthenticatableContract::class, function ($app) {            return call_user_func($app['auth']->userResolver());        }    );}

嗯,現在我想你差不多瞭解bind方法的作用了吧。

說白了 其實就是通過註冊函數 把組件儲存到一個大數組中

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.