Laravel 使用依賴注入呼叫方法

hengbo_liu發表於2019-12-16

1.1 使用場景

  • 如果需要呼叫某個類的方法,但此方法需要依賴注入物件,如果按照正常流程進行進行呼叫(先new物件,再傳引數),一是呼叫比較麻煩;二是依賴注入的類中可能又用了其他依賴注入的類,這種情況根本無法進行例項化
  • 例如:(正常邏輯首先new TestService類,在new Builder類傳參呼叫,但一看builder類中的夠著方法,發現有又注入了介面)
// 呼叫此類中write方法
use Illuminate\Database\Query\Builder;

class TestService
{
    public function write(Builder $builder){
        return  "123";
    }
}
// builder類中的構造方法
    public function __construct(ConnectionInterface $connection,
                                Grammar $grammar = null,
                                Processor $processor = null)
    {
        $this->connection = $connection;
        $this->grammar = $grammar ?: $connection->getQueryGrammar();
        $this->processor = $processor ?: $connection->getPostProcessor();
    }

1.2 call注入靜態方法

public function testContainerCallStatic(){
        App::call(TaskRepository::class.'@testContainerCallStatic');
        App::call(TaskRepository::class.'::testContainerCallStatic');
        App::call([TaskRepository::class,'testContainerCallStatic']);
    }

1.2 call注入非靜態方法

public function testContainerCall(){
        $taskRepo = new TaskRepository();
        App::call(TaskRepository::class.'@testContainerCall');
        App::call([$taskRepo,'testContainerCall']);
    }

1.3 呼叫1.1中TestService類的write方法

// 無需例項化builder,此處只使用call的一種寫法,其他寫法可自行嘗試
use App\Service\TestService;
use Illuminate\Support\Facades\App;

    public function test(){
        $res = App::call(TestService::class.'@write');
        return $res;
    }

Tip:參考文章:部落格:Laravel 核心——IoC 服務容器

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章