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 協議》,轉載必須註明作者和本文連結