国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

現(xiàn)在公司業(yè)務(wù)需要在C層的基礎(chǔ)上添加一個(gè)services層,代替controller進(jìn)行一部分業(yè)務(wù)處理.
所以我在app目錄下新建了一個(gè)Services文件夾,然後在c層控制器裡調(diào)用:
$services = App::make('要呼叫的service的完整類別名稱');
這樣雖然可以取得到services資料夾裡指定的類別了,但是如果這個(gè)類別的建構(gòu)子需要參數(shù)則完全無(wú)法傳遞.
我嘗試過這樣寫:
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方法取得實(shí)例化物件$services的時(shí)候,沒有觸發(fā)他的__construct()建構(gòu)子,沒有輸出$a,$b和111,但是$services->test()卻成功執(zhí)行了,輸出了'成功'.
如果是這樣,請(qǐng)問各位大神,如果我希望在controller中引入和執(zhí)行services文件夾下的類來分擔(dān)一部分業(yè)務(wù)邏輯的實(shí)現(xiàn),我要怎麼引入呢?我覺得App:: make()這個(gè)方法是很好的,不需要手動(dòng)require,直接獲取到了實(shí)例化對(duì)象,可是為什麼成功得到了實(shí)例化對(duì)象但是卻沒有執(zhí)行構(gòu)造函數(shù)輸出111呢?我到底怎麼才能在c層通過App: :make()來傳入?yún)?shù)給services層的建構(gòu)子呢?
期待大家的幫助,謝謝各位大神了.

滿天的星座
滿天的星座

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

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

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

如果需要向構(gòu)造方法傳遞參數(shù),請(qǐng)使用App::makeWith('className', [param1, param2, ...])。

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

黃舟

直接靜態(tài)類別算了,我後來發(fā)現(xiàn)每次都要實(shí)例化,雖然控制器裡注入自動(dòng)實(shí)例化,但是在其他地方呼叫還得手動(dòng),所以都被我靜態(tài)類別了。 。 。 。 。

劉奇

依賴注入不就能解決嗎

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板