以前...
只知道用靜態方法(官方文件也都用靜態方法)
TestService::getTest()
- 必須宣告靜態方法
- 如果宣告為靜態方法,那一開始就全部放進記憶體,但這個東西不見得會用到
- 把到處都會用到的東西才要放進記憶體(設成靜態)
- 其實還有狀態問題 靜態methods/properties 都不適合做有狀態應用
依賴注入(DI)
另一個選擇:依賴注入
在講 DI 之前,要先知道怎麼不 DI(就是 new 啦)
new TestService()->getTest()
- 缺點 要抽掉 TestService 就要修改
- 如果是測試想隔離抽換,就要用 DI
依賴注入如何解決這個問題:
// 簡寫筆記
private $testService;
__construct(TestService $testService)
{
$this->testService = $testService;
// 依賴注入 建構子的注入
// Laravel 會在建立這個 controller 時幫你實例一個 TestServiece 參數放進去
}
這樣就是創建 controller 才會實例化這個 class,不會放一堆東西進記憶體。
還有什麼時候會用到依賴注入=>自動測試
原因:Service 應該要可以被隔離
因為可能在做單元測試,想控制變因。想隔離的服務可能是:接金流、讀 DB。靜態方法在測試可以用 alias 解決,但 DI 比較好
mock
mock 會幫你用做一個假的 class。
測試時期宣告這段,就會創一個假 class 先把你後面的換掉,甚至在測試階段這個 getTest function 可以壞掉,還是會通過測試。
this->mock 那一段 的意思,(在這一段測試程式裡面)之後遇到 TestService 都要換成 mockery 的 TestService