php - laravel如何透過容器取得自訂類別並且傳遞參數?
滿天的星座
滿天的星座 2017-05-16 12:59:28
0
3
731

現在公司業務需要在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層的建構子呢?
期待大家的幫助,謝謝各位大神了.

滿天的星座
滿天的星座

全部回覆(3)
淡淡烟草味

我不知道你是怎麼成功的,至少我按照你的做法,在我本地測試了下,是不成功的(我的Laravel是5.4版本的)。

我也看了App::make('className')相關的程式碼, 首先該方法不支援為構造方法傳參數。

如果需要向構造方法傳遞參數,請使用App::makeWith('className', [param1, param2, ...])

其程式碼實作是利用反射,檢查建構函式是否需要傳參數:
1,如果不需要傳參數,則直接實例化
2,如果需要傳參數,且參數為可實例化的類,則嘗試實例化此類別(循環進入App::makeApp::makeWith()的邏輯),並將實例化之後的類別作為參數傳入
3,如果需要傳輸參數,且參數為不可實例化的參數(例如沒有類型提示的變量,類型提示為整數、字串、浮點等),則進一步檢查是否有預設參數,如果有預設參數,則傳預設參數到建構函數,如果沒有預設參數則拋出異常,如下圖:

黄舟

直接靜態類別算了,我後來發現每次都要實例化,雖然控制器裡注入自動實例化,但是在其他地方呼叫還得手動,所以都被我靜態類別了。 。 。 。 。

刘奇

依賴注入不就能解決嗎

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板