2016-02-28 96 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)'的任何地方运行来创建对象(它可以是新实例或同一个实例,具体取决于它是否被定义为单身或不)。 –