laravel5自定義服務提供者

Contracts, ServiceContainer, ServiceProvider, Facades關係

概念

  1. Contracts 合同,契約,也就是接口,定義一些規則,每一個實現此接口的都要實現裏面的方法php

  2. ServiceContainer 實現Contracts,具體的邏輯實現laravel

  3. ServiceProvider ServiceContainer的服務提供者,返回ServiceContainer的實例化,供其餘地方使用,能夠把它加入到app/config的provider中,會被自動註冊到容器中segmentfault

  4. Facades 簡化ServiceProvider的調用方式,並且能夠靜態調用ServiceContainer中的方法數組

實現

Contracts接口能夠寫或不寫,這裏就不定義了定義一個ServiceContainer,實現具體的功能app

namespace App\Helper;
class MyFoo{
    public function add($a, $b)
    {
        return $a+$b;
    }
}

定義一個ServiceProvider供其餘地方使用ServiceContain框架

<?phpnamespace App\Providers;

use App\Helper\MyFoo; //要服務的Containeruse Illuminate\Support\ServiceProvider;
use App;

class MyFooServiceProvider extends ServiceProvider{
    public function boot(){}
    //註冊到容器中
    public function register()
    {
        //能夠這麼綁定,這須要use App;
        App::bind("myfoo",function(){
            return new MyFoo();
        });
        //也能夠這麼綁定
        $this->app->bind("myfoo", function(){
            return new MyFoo();
        });
    }
}

在app/config.php中的providers數組中加入ServiceProvider,讓系統自動註冊ide

App\Providers\MyFooServiceProvider::class,

這時候就能夠使用了,假設在控制器中使用this

public function two($id=null){
    //從系統容器中獲取實例化對象
    //app('myfoo')->add(1,2);
    $myfoo = App::make("myfoo");
    echo $myfoo->add(1,2);
}

這樣太麻煩,還須要用make來獲取對象,爲了簡便,就能夠使用門面功能,定義門面MyFooFacadespa

namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class MyFooFacade extends Facade{
    protected static function getFacadeAccessor()
    {
        //這裏返回的是ServiceProvider中註冊時,定義的字符串
        return 'myfoo';
    }
}

在控制器裏就能夠直接調用了code

use App\Facades\MyFooFacade;
public function two($id=null){
    //從系統容器中獲取實例化對象
    $myfoo = App::make("myfoo");
    echo $myfoo->add(1,2);
    //使用門面
    echo MyFooFacade::add(4,5);
}

總的來講,自定義了一個類,爲了方便在其餘別處使用,即可以使用服務提供者和門面

----------------------------華麗的分割線----------------------------
簡單的說,「服務容器」就是「服務提供者」提供的服務的容器,「服務容器」經過「服務提供者」來獲取服務。
一個laravel應用就是一個「服務容器」,整個框架提供的各類功能由「服務提供者」提供並注入到「服務容器」中。每個「服務提供者」裏register的方法裏面使用bind邦定某個對象到一個變量,那個對象就是真正提供服務的對象。

轉自:http://www.javashuo.com/article/p-tfphedjs-d.html

相關文章
相關標籤/搜索