2016-02-28 151 views
3

我已經註冊了一個單身的服務提供商,像這樣:如何在課堂上訪問Laravel Singletons?

$this->app->singleton(MyClass::class); 

這可以正常訪問,只需說明它的參數,像這樣:

class FooController extends Controller 
{ 
    public function index(MyClass $myClass) 
    { 
     //... 
    } 
} 

但是我似乎無法能夠在其他自定義類(即非控制器類)中訪問此單例。 (https://laravel.com/docs/5.2/container#resolving

例如喜歡這裏:

class Bar { 
    private $myClass; 
    private $a; 
    private $b; 

    public function __construct($a, $b) { 
     $this->a = $a; 
     $this->b = $b; 
     $this->myClass = ... // TODO: get singleton 
    } 
} 

我該怎麼辦呢?

請注意,我將創建Bar的多個實例。

+0

但是,我該如何創建一個'Bar'的實例。此外,是否有另一種方法來檢索它(即不是來自構造函數)。 –

回答

3

在您的構造函數中鍵入提示類/接口,在大多數情況下,Laravel會自動解析並將其注入到類中。

查看Service Provider documentation瞭解一些示例和替代方法。

去與你的例子:

class Bar { 
    private $myClass; 

    public function __construct(MyClass $myClass) { 
     $this->myClass = $myClass; 
    } 
} 

在情況下Bar::__construct採取其他參數不能每個定義的服務提供者,你將不得不使用一個服務定位:

/* $this->app is an instance of Illuminate\Foundation\Application */ 
$bar = new Bar($this->app->make(MyClass::class), /* other parameters */); 

或者,將服務位置移到它自己的構造函數中:

use Illuminate\Support\Facades\App; 

class Bar { 
    private $myClass; 

    public function __construct() { 
     $this->myClass = App::make(MyClass::class); 
    } 
} 
+0

這種方法的問題是我將如何創建Bar的多個實例(特別是如果我在構造函數中有更多參數)。即'$ bar = new Bar(5,10);'。更新後的問題以顯示我的意思 –

+0

@YahyaUddin更新了答案 – nCrazed

2

您可以使用單運行應用程序的方法make這樣:

use Illuminate\Contracts\Foundation\Application; 

class Bar { 
    private $myClass; 
    private $a; 
    private $b; 

    public function __construct($a, $b, Application $app) { 
     $this->a = $a; 
     $this->b = $b; 
     $this->myClass = $app->make(MyClass::class); 
    } 
} 

您可以在Container resolving documentation閱讀更多關於這一點。

+0

如何創建多個不同的'Bar'實例? –

+0

還有一種方法可以訪問靜態上下文中的'$ app'變量 –

+0

@YahyaUddin我們不是在談論「Bar」。你可以使用'App :: make(Bar :: class)'來創建它的實例。你可以在任何地方使用'App'外觀,而不是注入'Application',這樣你就可以在App :: make(SomeClass :: class)'的任何地方運行來創建對象(它可以是新實例或同一個實例,具體取決於它是否被定義爲單身或不)。 –