2017-02-18 68 views
1

可以說我有一個封閉:傳遞變量來關閉

$object->group(function() { 
    $object->add('example'); 
    $object->add('example'); 
}); 

因爲$對象未在封閉定義它不會工作。

注意:未定義的變量:經理

所以我不得不use ($object)

$object->group(function() use ($object) { 
    $object->add('example'); 
    $object->add('example'); 
}); 

現在我想保持它作爲簡單的第一個這樣莫名其妙$對象必須被注入進入關閉。

的Laravel框架這是否符合路由例如:

Route::group(['middleware' => 'auth'], function() { 
    Route::get('/', function() { 
     // Uses Auth Middleware 
    }); 

    Route::get('user/profile', function() { 
     // Uses Auth Middleware 
    }); 
}); 

我相信Laravel這是否與反思類。

我怎麼能做到這一點?

+0

我發現'function()use($ object)'絕對沒有錯。另一種方法沒有什麼更清潔的。絕對zilch。 –

+0

我只是想知道Laravel是如何做到這一點的。 –

+0

Laravel使用'static'。你正在使用對象。 –

回答

0

你的目標是知道如何提供一個參數給閉包。這是通過call_user_func_array實現的。

讓我們在接受閉包的類中定義一個方法。

class MyTestClass 
{ 
    public function doWork(callable $callback) 
    { 
     return call_user_func_array($callback, [$this]); 
    } 
} 

$obj = new MyTestClass(); 

$obj->doWork(function(MyTestClass $obj) { 
    // 
}); 

注意:沒有測試,但我認爲這就是你之後?

+0

在這種情況下,你仍然需要設置參數,對吧?我想像Laravel那樣做。所以不知何故依賴被注入到閉包中。也許它的內容被克隆並附加到?我沒有任何線索。 –

+0

我發現了一個非常醜陋的做法,所以我決定堅持使用參數。你可以做的是獲得方法的內容,就像這樣:http://stackoverflow.com/questions/7026690/reconstruct-get-code-of-php-function。然後使用'create_function'來創建一個函數,它接受一個參數然後注入依賴關係。 –

+1

您可以在閉包中有可變數量的參數。你可以有可空的參數。如果你想對不定數量的參數進行提示,那麼你可能需要使用「反射」,這會變得很難看(要檢查它所期望的參數)。我不認爲你真的需要做得過分:) –

0

您不必擔心反射。臭名昭着的Laravel的依賴注入容器將爲您處理。 所有你需要的是告訴他什麼注入什麼時classinterface是鍵入暗示。

// xXxServiceProvider.php 
function register(){ 
    ... 
    this->app->bind('ObjNamespace\ObjClass', function ($app) { 
     return new ObjNamepsace\ObjClass(); 
    }); 
} 

現在,讓我們假設您需要在您的路線句柄中輸入ObjNamepsace\ObjClass

Route::get('user/profile', function (ObjNamepsace\ObjClass $object) { 
    // $object is resolved via type hinting 
}); 

此外,還有三個結合的方法,你可能會選擇哪一個適合您的用例:

  • bind:在每次調用注入一個新的實例,Laravel將創建一個新的$對象每次。

  • singleton:注入相同的實例,Laravel將在第一次調用時創建實例並在每次調用時注入它。如果您想創建$object一次,請使用它。

  • instance:您將classinterface綁定到對象實例。

+0

laravel路線是我想達到的一個例子。這個項目不是在Laravel –

+0

爲什麼Laravels服務容器「臭名昭着」 –

+0

據我所知,依賴注入的使用在跨框架沒有太大差別。同樣的原則適用於任何地方 – motia