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