現在公司業務需要在C層的基礎上添加一個services層,代替controller進行一部分業務處理.
所以我在app目錄下新建了一個Services文件夾,然後在c層控制器裡調用:
$services = App::make('要呼叫的service的完整類別名稱');
這樣雖然可以取得到services資料夾裡指定的類別了,但是如果這個類別的建構子需要參數則完全無法傳遞.
我嘗試過這樣寫:
controller層:
public function test(){
$services = \App::make('App\Services\Servicetest',[1,2]);
$services->test();
}
在app/services目錄下的Servicetest.php裡這樣寫:
public function __construct($a, $b){
echo $a;
echo $b;
echo 111;
exit;
}
public function test(){
echo '成功';
}
很奇怪,在透過make方法取得實例化物件$services的時候,沒有觸發他的__construct()建構子,沒有輸出$a,$b和111,但是$services->test()卻成功執行了,輸出了'成功'.
如果是這樣,請問各位大神,如果我希望在controller中引入和執行services文件夾下的類來分擔一部分業務邏輯的實現,我要怎麼引入呢?我覺得App:: make()這個方法是很好的,不需要手動require,直接獲取到了實例化對象,可是為什麼成功得到了實例化對象但是卻沒有執行構造函數輸出111呢?我到底怎麼才能在c層通過App: :make()來傳入參數給services層的建構子呢?
期待大家的幫助,謝謝各位大神了.
我不知道你是怎麼成功的,至少我按照你的做法,在我本地測試了下,是不成功的(我的Laravel是5.4版本的)。
我也看了
App::make('className')
相關的程式碼, 首先該方法不支援為構造方法傳參數。如果需要向構造方法傳遞參數,請使用
App::makeWith('className', [param1, param2, ...])
。其程式碼實作是利用反射,檢查建構函式是否需要傳參數:
1,如果不需要傳參數,則直接實例化
2,如果需要傳參數,且參數為可實例化的類,則嘗試實例化此類別(循環進入
App::make
或App::makeWith()
的邏輯),並將實例化之後的類別作為參數傳入3,如果需要傳輸參數,且參數為不可實例化的參數(例如沒有類型提示的變量,類型提示為整數、字串、浮點等),則進一步檢查是否有預設參數,如果有預設參數,則傳預設參數到建構函數,如果沒有預設參數則拋出異常,如下圖:
直接靜態類別算了,我後來發現每次都要實例化,雖然控制器裡注入自動實例化,但是在其他地方呼叫還得手動,所以都被我靜態類別了。 。 。 。 。
依賴注入不就能解決嗎