Laravel文檔的
Service Container、
Service 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 Container、Service 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()方法:
把什麼綁定到什嗎?和前面一樣,綁定的雙方是什麼。
麻煩大神幫解釋一下。非常感謝!
bootstrapping是指Service Provider的註冊啟動過程。簡單說,就是一個Service Provider怎麼註冊進Service Container,註冊事件監聽等。
boot方法的作用是當Service Provider註冊進Service Container並被Service Container啟動後執行的啟動代碼,做一些初始化的操作。
register()方法就是具體的通過調用Container的bind()方法實現把Service綁定到Service Container的屬性上。
bind()方法是在Service Container的方法,Service Provider通過這個方法(以及其他類似方法)來執行綁定。
在Laravel中,一個app就是一個最常見的Service Container,它本質上是一個對象,通過它的bind方法,我們可以為他增加一個屬性,這個屬性就是Service Provider。但是這個屬性的名字等資訊怎麼來呢,由Service Provider的register決定,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方法的作用了吧。
說白了 其實就是通過註冊函數 把組件儲存到一個大數組中