如何擴展Laravel

註冊服務

向容器中註冊服務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

Manager其實是一個工廠,它爲服務提供了驅動管理功能。緩存

Laravel中的不少組件都使用了Manager,如:AuthCacheLogNotificationQueueRedis等等,每一個組件都有一個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

有些狀況下,咱們須要給一個類動態增長几個方法,Macro或者Mixin很好的解決了這個問題。對象

在Laravel底層,有一個名爲MacroableTrait,凡是引入了Macroable的類,都支持MacroMixin的方式擴展,好比RequestResponseSessionGuardViewTranslator等等。get

Macroable提供了兩個方法,macromixinmacro方法能夠給類增長一個方法,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');
相關文章
相關標籤/搜索