向容器中註冊服務php
// 綁定服務 $container->bind('log', function(){ return new Log(); }); // 綁定單例服務 $container->singleton('log', function(){ return new Log(); });
擴展已有服務redis
$container->extend('log', function(Log $log){ return new RedisLog($log); });
Manager其實是一個工廠,它爲服務提供了驅動管理功能。緩存
Laravel中的不少組件都使用了Manager,如:Auth
、Cache
、Log
、Notification
、Queue
、Redis
等等,每一個組件都有一個xxxManager
的管理器。咱們能夠經過這個管理器擴展服務。函數
好比,若是咱們想讓Cache
服務支持RedisCache
驅動,那麼咱們能夠給Cache
服務擴展一個redis
驅動:this
Cache::extend('redis', function(){ return new RedisCache(); });
這時候,Cache
服務就支持redis
這個驅動了。如今,找到config/cache.php
,把default
選項的值改爲redis
。這時候咱們再用Cache
服務時,就會使用RedisCache
驅動來使用緩存。code
有些狀況下,咱們須要給一個類動態增長几個方法,Macro
或者Mixin
很好的解決了這個問題。對象
在Laravel底層,有一個名爲Macroable
的Trait
,凡是引入了Macroable
的類,都支持Macro
和Mixin
的方式擴展,好比Request
、Response
、SessionGuard
、View
、Translator
等等。get
Macroable
提供了兩個方法,macro
和mixin
,macro
方法能夠給類增長一個方法,mixin
是把一個類中的方法混合到Macroable
類中。it
舉個例子,好比咱們要給Request
類增長兩個方法。io
使用macro
方法時:
Request::macro('getContentType', function(){ // 函數內的$this會指向Request對象 return $this->headers->get('content-type'); }); Request::macro('hasField', function(){ return !is_null($this->get($name)); }); $contentType = Request::getContentstType(); $hasPassword = Request::hasField('password');
使用mixin
方法時:
class MixinRequest{ public function getContentType(){ // 方法內必須返回一個函數 return function(){ return $this->headers->get('content-type'); }; } public function hasField(){ return function($name){ return !is_null($this->get($name)); }; } } Request::mixin(new MixinRequest()); $contentType = Request::getContentType(); $hasPassword = Request::hasField('password');