laravel 服務提供者介紹和使用


#安裝傳送門 安裝composer,以及通過composer安裝laravel

#講解使用

服務提供者這個具體表現都是圍繞着依賴注入

在根目錄config/app.php的providers中的數組中配置

 

#服務提供者可以理解成,為了能在系統的上下文中能夠使用類示例,系統內部封裝了反射分析容器中的注冊的綁定類名或者別名,進行依賴管理和注入。

比如我需要在全文調用一個log方法,這個方法是用來進行項目中的debug的輸出,替換掉普通的echo方法。類似tp3.2的想法會在系統的公共方法中寫好,但是laravel基本都是oop所以這種就變成了類的調用的形式。可以在系統上注冊一個服務提供者,然后在laravel的生命周期里面可以進行使用。下面是測試示例以及步驟

#先創建一個測試的log類

namespace App\Http\Logic;


class LogLogic
{
    public  $type = null;
    public function __construct($type)
    {
        $allowType = ['MonogDB','File','Redis'];
        if(!in_array($type,$allowType)){
            throw new \Exception("can't find driver");
        }
        $this->type  = $type;
    }

    /**
     * @param $str
     */
    public  function  log($str){
        echo "當前使用的是".$this->type."驅動:{$str}";
    }

}  

類我們創建好了,當然可以隨處調用。但是我們可以通過依賴注入的方式能更加直觀調用

接下來我們創建一個服務提供者

php artisan make:provider MlogProvider

在類中的register方法中進行實例化,以及綁定到容器

bind和singleton的區別是,bind是每次都是通過函數返回類的是實例,singleton是通過函數返回已經存在的實例(參照單例)

class MlogProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
        $this->app->bind(LogLogic::class, function ($app) {
            return new LogLogic(config('mconfig.logDriver'));
        });
    }
}  

然后我們創建一個配置文件,config/mconfig。

return [
    'logDriver'=>'File'
];  

在config/app.php中加入服務提供者

App\Providers\MlogProvider::class,  

在controller中進行測試

<?php

namespace App\Http\Controllers;

use App\Http\Logic\LogLogic;
use Illuminate\Http\Request;

class UsersController extends Controller
{
    //
    public function index(Request $requser,LogLogic $logLogic){
       $logLogic->log('hello');
    }
}  

然后訪問路由:會正常輸出

當前使用的是File驅動:hello

 

接下來我們測試一下單例的綁定

修改服務提供者

public function register()
    {
        //
        $this->app->singleton(LogLogic::class, function ($app) {
            return new LogLogic(config('mconfig.logDriver'));
        });
    }  

我們寫入一個邏輯類,這里會去容器中獲取LogLogic的實例,然后更改驅動為redis

<?php
/**
 * Created by PhpStorm.
 * User: xujun
 * Date: 2018/3/10
 * Time: 14:53
 */

namespace App\Http\Logic;


class TestSingletonLogic
{
    public  function  step1(){
        //利用app方法創建
        $logLogic = resolve(LogLogic::class);
        $logLogic->type = 'Redis';
    }
}  

修改controller

<?php

namespace App\Http\Controllers;

use App\Http\Logic\LogLogic;
use App\Http\Logic\TestSingletonLogic;
use Illuminate\Http\Request;

class UsersController extends Controller
{
    //
    public function index(Request $requser,LogLogic $logLogic){
        $logLogic->log('hello');
        //將類型變成MonogDB
        $logLogic->type = 'MonogDB';
        (new TestSingletonLogic())->step1();
        $logLogic->log('laravel');

    }
}  

輸出結果,說明了容器內的對象是單例。

當前使用的是File驅動:hello當前使用的是Redis驅動:laravel

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM