laravel重要概念和知識點

世有因果知因求果發表於2015-06-15

  Service Provider:

一個laravel service provider就是一個註冊IoC container binding的類。實際上,laravel本身就自包含了一堆管理核心框架元件的container binding的service provider. 一個service provider必須具有至少一個方法: register. 該方法就是執行該service provider繫結其暴露給laravel ioc container的類庫的函式。當一個請求進入到application,而框架本身booting up時,那麼所有在app.php中定義的service provider的register函式將被呼叫。這個過程在applicaiton的life cycle很早就發生了,因此當你bootup你自己的檔案時,這些laravel service就已經可用了,比如所有在start目錄中定義的自己的程式碼。

注意:永遠不要在register方法中使用laravel的services,因為這個函式只用來繫結objects到ioc container.所有解析和呼叫相關bounded class的工作必須在service provider的boot函式中呼叫。(在所有的service providers被成功註冊後,這些元件就進入booted狀態,這時將會呼叫每個service provider的boot函式。通常boot函式可以做任何你想做的事情,比如register event listener,包含一個route file,register filter等等)

注意:並不是所有第三方的pacakges都需要一個service provider.事實上,甚至不需要service provider來保證第三方元件正常工作,原因是service provider本身只完成bootstrap component的功能(註冊給ioc container)。不過service provider確實提供了一個組織第三方component的bootstrap程式碼及binding ioc的一個方便的地方,值得使用!

為了提高laravel的效能,laravel本身提供了deferred service provider的概念。比如QueueServiceProvider只有在確實需要queue時才初始化,而在一般的request中並不需要。這個機制通過如下方法實現: app/storage/meta目錄儲存了所謂service manifest列表,該列表列出所有的ioc binding name和其serivce provider對應關係。這樣,當application請求container要求queue container binding時,laravel就知道它需要初始化queue物件,因此執行QueueServiceProvider來例項化。這樣就允許了laravel實現lazy-load service provider for each request,大大提高了效能。

 separate concerns

一個好的設計可能有一下就能實現:separating responsibilities, creating layers of responsibility.  controllers are responsible for receiving an HTTP request and calling the proper business layer classes.你的business/domain layer才是你的應用。她包含retrieve data, validate data, process payments, send e-mail andother functionality。

事實上,你的domain layer根本無需知道“the web”! The web is simply a transport mechanism to access your application, and knowledge of the web and HTTP need not go beyond the routing and controller layers.

Classname::class解釋

namespace MyProject;
class Alpha{ }

namespace MyOtherProject;
class Beta{ }

echo Alpha::class; // displays: MyProject\Alpha
echo Beta::class; // displays: MyOtherProject\Beta

自從PHP5.5,class關鍵字也被用來作為class name resolution.你可以通過使用ClassName::class來獲取一個包含fully qualified name.這個功能對於namespaced class非常有用!!

相關文章